[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 |