[React.js] 9. 폼

2021. 8. 3. 21:42개발/React.js

반응형

HTML 을 해보면 폼 자체가 가진 동작(?) 을 사용할때가 있다.

예를 들어, <input> 같은 태그를 사용하게되면, 속성값에 따라 javascript 없이 특정 동작을 하게 도와준다.

하지만, javascript로 관리하면 더 편리하게 사용할 수 있다.

 

그리고, 이 폼이 가진 값을 React에서 관리하고 추적할 수 있게 하는것을 제어 컴포넌트 (Controlled Component) 라고 부른다.

 

<input>

아래 예시를 보면 onChange 이벤트시 React 에서 바인딩된 함수가 호출되어 state로 관리하게 되는것을 볼 수 있다.

class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {value: ''};

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    this.setState({value: event.target.value});
  }

  handleSubmit(event) {
    alert('A name was submitted: ' + this.state.value);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" value={this.state.value} onChange={this.handleChange} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

 

 

 

<textarea>

<textarea>  의 경우 자식으로 문자열을 가지는 태그이지만 React에서는 value속성을 이용할 수 있다.

render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Essay:
          <textarea value={this.state.value} onChange={this.handleChange} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }

 

 

 

<select>

select 태그의 경우 드롭 다운 목록을 만들 수 있다. React에서는 select 태그에 value속성으로 state 값을 관리할 수 있다.

<select value={this.state.value} onChange={this.handleChange}>
  <option value="grapefruit">Grapefruit</option>
  <option value="lime">Lime</option>
  <option value="coconut">Coconut</option>
  <option value="mango">Mango</option>
</select>

 

 

 

Multiple input Control

글로만 보면 이해가 어렵다. 

두개의 Input 태그가 보이는데 onChange 이벤트 발생시 하나의 함수로 관리하고 있다.

비슷한 이벤트 처리가 필요하다면 ES6부터 지원하는 computed property를 사용하여 쉽게 state를 관리할 수 있다.

lass Reservation extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      isGoing: true,
      numberOfGuests: 2
    };

    this.handleInputChange = this.handleInputChange.bind(this);
  }

  handleInputChange(event) {
    const target = event.target;
    const value = target.type === 'checkbox' ? target.checked : target.value;
    const name = target.name;

    this.setState({
      [name]: value
    });
  }

  render() {
    return (
      <form>
        <label>
          Is going:
          <input
            name="isGoing"
            type="checkbox"
            checked={this.state.isGoing}
            onChange={this.handleInputChange} />
        </label>
        <br />
        <label>
          Number of guests:
          <input
            name="numberOfGuests"
            type="number"
            value={this.state.numberOfGuests}
            onChange={this.handleInputChange} />
        </label>
      </form>
    );
  }
}
반응형

'개발 > React.js' 카테고리의 다른 글

[React.js] 11. 합성 vs 상속  (0) 2021.08.10
[React.js] 10. state 끌어올리기  (0) 2021.08.06
[React.js] 8. List 와 Key  (0) 2021.08.02
[React.js] 7. 조건부 렌더링  (0) 2021.07.22
[React.js] StopWatch 구현하기  (0) 2021.07.21