React 기초
[React] Form (8)
Evolving Developer
2023. 2. 18. 09:07
HTML
<form>
<label>
Name:
<input type="text" name="name" />
</label>
<input type="submit" value="Submit" />
</form>
- <input name="name"> </input> 태그로 name을 입력받음
JS
- 제어 컴포넌트 사용
제어 컴포넌트
- JS 함수로 폼의 제출을 처리하고 사용자가 폼에 입력한 데이터에 접근하도록
- 변경값은 state에 유지되며 setState()에 의해 업데이트 됨
class NameForm extends React.Component {
constructor(props) { // 생성자
super(props);
this.state = {value: ''}; // 빈칸으로 초기화
this.handleChange = this.handleChange.bind(this); // 바인딩
this.handleSubmit = this.handleSubmit.bind(this); // 바인딩
}
// event 값이 변경되면 value의 state 값을 사용자 입력값으로 변경
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}> // handleSubmit 함수 실행
<label>
Name:
<input type="text" value={this.state.value} onChange={this.handleChange} />
</label>
<input type="submit" value="Submit" />
</form>
);
}
}
select 태그
- 드롭 다운 목록
HTML
<select>
<option value="grapefruit">Grapefruit</option>
<option value="lime">Lime</option>
<option selected value="coconut">Coconut</option>
<option value="mango">Mango</option>
</select>
JS
class FlavorForm extends React.Component {
constructor(props) {
super(props);
this.state = {value: 'coconut'}; // coconut을 기본값으로 설정
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({value: event.target.value});
}
handleSubmit(event) {
alert('Your favorite flavor is: ' + this.state.value);
event.preventDefault();
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
Pick your favorite flavor:
<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>
</label>
<input type="submit" value="Submit" />
</form>
);
}
}
- multiple 옵션 : 다중 선택 -> value에 배열 전달
<select multiple={true} value={['B', 'C']}>
file input 태그
- 자신의 저장소에서 서버로 파일 업로드
<input type="file" />
- 읽기 전용 -> 비제어 컴포넌트
다중 입력 제어하기
class Reservation extends React.Component {
constructor(props) {
super(props);
this.state = {
isGoing: true,
numberOfGuests: 2 // 맨처음 값을 2로 초기화
};
this.handleInputChange = this.handleInputChange.bind(this);
}
handleInputChange(event) {
const target = event.target;
// 입력값의 type이 checkbox라면 checked 변수 데이터를 value에 담음
// 입력값의 type이 checkbox가 아니라면 value 변수 데이터를 value에 담음
const value = target.type === 'checkbox' ? target.checked : target.value;
// isGoing 혹은 numberOfGuests
const name = target.name;
this.setState({
[name]: value
});
}
render() {
return (
<form>
<label>
Is going:
// type : checkbox -----------------------------------
<input
name="isGoing"
type="checkbox"
checked={this.state.isGoing}
onChange={this.handleInputChange} />
</label>
<br />
<label>
Number of guests:
// type : number -----------------------------------
<input
name="numberOfGuests"
type="number"
value={this.state.numberOfGuests}
onChange={this.handleInputChange} />
</label>
</form>
);
}
}