ํผ
These docs are old and wonโt be updated. Go to react.dev for the new React docs.
These new documentation pages teach modern React and include live examples:
HTML ํผ ์๋ฆฌ๋จผํธ๋ ํผ ์๋ฆฌ๋จผํธ ์์ฒด๊ฐ ๋ด๋ถ ์ํ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์, React์ ๋ค๋ฅธ DOM ์๋ฆฌ๋จผํธ์ ๋ค๋ฅด๊ฒ ๋์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์์ํ HTML์์ ์ด ํผ์ name์ ์ ๋ ฅ๋ฐ์ต๋๋ค.
<form>
<label>
Name:
<input type="text" name="name" />
</label>
<input type="submit" value="Submit" />
</form>
์ด ํผ์ ์ฌ์ฉ์๊ฐ ํผ์ ์ ์ถํ๋ฉด ์๋ก์ด ํ์ด์ง๋ก ์ด๋ํ๋ ๊ธฐ๋ณธ HTML ํผ ๋์์ ์ํํฉ๋๋ค. React์์ ๋์ผํ ๋์์ ์ํ๋ค๋ฉด ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ, JavaScript ํจ์๋ก ํผ์ ์ ์ถ์ ์ฒ๋ฆฌํ๊ณ ์ฌ์ฉ์๊ฐ ํผ์ ์ ๋ ฅํ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋๋ก ํ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค. ์ด๋ฅผ ์ํ ํ์ค ๋ฐฉ์์ โ์ ์ด ์ปดํฌ๋ํธ (controlled components)โ๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ธฐ์ ์ ์ด์ฉํ๋ ๊ฒ์ ๋๋ค.
์ ์ด ์ปดํฌ๋ํธ (Controlled Component)
HTML์์ <input>
, <textarea>
, <select>
์ ๊ฐ์ ํผ ์๋ฆฌ๋จผํธ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์์ ์
๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก ์์ ์ state๋ฅผ ๊ด๋ฆฌํ๊ณ ์
๋ฐ์ดํธํฉ๋๋ค. React์์๋ ๋ณ๊ฒฝํ ์ ์๋ state๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ปดํฌ๋ํธ์ state ์์ฑ์ ์ ์ง๋๋ฉฐ setState()
์ ์ํด ์
๋ฐ์ดํธ๋ฉ๋๋ค.
์ฐ๋ฆฌ๋ React state๋ฅผ โ์ ๋ขฐ ๊ฐ๋ฅํ ๋จ์ผ ์ถ์ฒ (single source of truth)โ๋ก ๋ง๋ค์ด ๋ ์์๋ฅผ ๊ฒฐํฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ํผ์ ๋ ๋๋งํ๋ React ์ปดํฌ๋ํธ๋ ํผ์ ๋ฐ์ํ๋ ์ฌ์ฉ์ ์ ๋ ฅ๊ฐ์ ์ ์ดํฉ๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ผ๋ก React์ ์ํด ๊ฐ์ด ์ ์ด๋๋ ์ ๋ ฅ ํผ ์๋ฆฌ๋จผํธ๋ฅผ โ์ ์ด ์ปดํฌ๋ํธ (controlled component)โ๋ผ๊ณ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ด์ ์์๊ฐ ์ ์ก๋ ๋ ์ด๋ฆ์ ๊ธฐ๋กํ๊ธธ ์ํ๋ค๋ฉด ํผ์ ์ ์ด ์ปดํฌ๋ํธ (controlled component)๋ก ์์ฑํ ์ ์์ต๋๋ค.
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>
);
}
}
value
์ดํธ๋ฆฌ๋ทฐํธ๋ ํผ ์๋ฆฌ๋จผํธ์ ์ค์ ๋๋ฏ๋ก ํ์๋๋ ๊ฐ์ ํญ์ this.state.value
๊ฐ ๋๊ณ React state๋ ์ ๋ขฐ ๊ฐ๋ฅํ ๋จ์ผ ์ถ์ฒ (single source of truth)๊ฐ ๋ฉ๋๋ค. React state๋ฅผ ์
๋ฐ์ดํธํ๊ธฐ ์ํด ๋ชจ๋ ํค ์
๋ ฅ์์ handleChange
๊ฐ ๋์ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ ๋ณด์ฌ์ง๋ ๊ฐ์ด ์
๋ฐ์ดํธ๋ฉ๋๋ค.
์ ์ด ์ปดํฌ๋ํธ๋ก ์ฌ์ฉํ๋ฉด, input์ ๊ฐ์ ํญ์ React state์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. ์ฝ๋๋ฅผ ์กฐ๊ธ ๋ ์์ฑํด์ผ ํ๋ค๋ ์๋ฏธ์ด์ง๋ง, ๋ค๋ฅธ UI ์๋ฆฌ๋จผํธ์ input์ ๊ฐ์ ์ ๋ฌํ๊ฑฐ๋ ๋ค๋ฅธ ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ ๊ฐ์ ์ฌ์ค์ ํ ์ ์์ต๋๋ค.
textarea ํ๊ทธ
HTML์์ <textarea>
์๋ฆฌ๋จผํธ๋ ํ
์คํธ๋ฅผ ์์์ผ๋ก ์ ์ํฉ๋๋ค.
<textarea>
Hello there, this is some text in a text area
</textarea>
React์์ <textarea>
๋ value
์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฒํ๋ฉด <textarea>
๋ฅผ ์ฌ์ฉํ๋ ํผ์ ํ ์ค ์
๋ ฅ์ ์ฌ์ฉํ๋ ํผ๊ณผ ๋น์ทํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
class EssayForm extends React.Component {
constructor(props) {
super(props);
this.state = { value: 'Please write an essay about your favorite DOM element.' };
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) { this.setState({value: event.target.value}); }
handleSubmit(event) {
alert('An essay was submitted: ' + this.state.value);
event.preventDefault();
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
Essay:
<textarea value={this.state.value} onChange={this.handleChange} /> </label>
<input type="submit" value="Submit" />
</form>
);
}
}
this.state.value
๋ฅผ ์์ฑ์์์ ์ด๊ธฐํํ๋ฏ๋ก textarea๋ ์ผ๋ถ ํ
์คํธ๋ฅผ ๊ฐ์ง์ฑ ์์๋๋ ์ ์ ์ฃผ์ํด์ฃผ์ธ์.
select ํ๊ทธ
HTML์์ <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>
selected
์ต์
์ด ์์ผ๋ฏ๋ก Coconut ์ต์
์ด ์ด๊ธฐ๊ฐ์ด ๋๋ ์ ์ ์ฃผ์ํด์ฃผ์ธ์. React์์๋ selected
์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ต์๋จ select
ํ๊ทธ์ value
์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ ๊ณณ์์ ์
๋ฐ์ดํธ๋ง ํ๋ฉด๋๊ธฐ ๋๋ฌธ์ ์ ์ด ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๊ธฐ ๋ ํธํฉ๋๋ค. ์๋๋ ์์์
๋๋ค.
class FlavorForm extends React.Component {
constructor(props) {
super(props);
this.state = {value: '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>
);
}
}
์ ๋ฐ์ ์ผ๋ก <input type="text">
, <textarea>
๋ฐ <select>
๋ชจ๋ ๋งค์ฐ ๋น์ทํ๊ฒ ๋์ํฉ๋๋ค. ๋ชจ๋ ์ ์ด ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ๋๋ฐ value
์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ํ์ฉํฉ๋๋ค.
์ฃผ์
select
ํ๊ทธ์ multiple ์ต์ ์ ํ์ฉํ๋ค๋ฉดvalue
์ดํธ๋ฆฌ๋ทฐํธ์ ๋ฐฐ์ด์ ์ ๋ฌํ ์ ์์ต๋๋ค.<select multiple={true} value={['B', 'C']}>
file input ํ๊ทธ
HTML์์ <input type="file">
๋ ์ฌ์ฉ์๊ฐ ํ๋ ์ด์์ ํ์ผ์ ์์ ์ ์ฅ์น ์ ์ฅ์์์ ์๋ฒ๋ก ์
๋ก๋ํ๊ฑฐ๋ File API๋ฅผ ํตํด JavaScript๋ก ์กฐ์ํ ์ ์์ต๋๋ค.
<input type="file" />
๊ฐ์ด ์ฝ๊ธฐ ์ ์ฉ์ด๊ธฐ ๋๋ฌธ์ React์์๋ ๋น์ ์ด ์ปดํฌ๋ํธ์ ๋๋ค. ๋ฌธ์ ๋ท๋ถ๋ถ์์ ๋ค๋ฅธ ๋น์ ์ด ์ปดํฌ๋ํธ์ ํจ๊ป ์ค๋ช ํ๊ณ ์์ต๋๋ค.
๋ค์ค ์ ๋ ฅ ์ ์ดํ๊ธฐ
์ฌ๋ฌ input
์๋ฆฌ๋จผํธ๋ฅผ ์ ์ดํด์ผํ ๋, ๊ฐ ์๋ฆฌ๋จผํธ์ name
์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ถ๊ฐํ๊ณ event.target.name
๊ฐ์ ํตํด ํธ๋ค๋ฌ๊ฐ ์ด๋ค ์์
์ ํ ์ง ์ ํํ ์ ์๊ฒ ํด์ค๋๋ค.
์๋๋ ์์์ ๋๋ค.
class 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>
);
}
}
์ฃผ์ด์ง input ํ๊ทธ์ name์ ์ผ์นํ๋ state๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด ES6์ computed property name ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
this.setState({
[name]: value});
ES5 ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
var partialState = {};
partialState[name] = value;this.setState(partialState);
๋ํ, setState()
๋ ์๋์ ์ผ๋ก ํ์ฌ state์ ์ผ๋ถ state๋ฅผ ๋ณํฉํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ ๋ถ๋ถ์ ๋ํด์๋ง ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
์ ์ด๋๋ Input Null ๊ฐ
์ ์ด ์ปดํฌ๋ํธ์ value
prop์ ์ง์ ํ๋ฉด ์๋ํ์ง ์๋ ํ ์ฌ์ฉ์๊ฐ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. value
๋ฅผ ์ค์ ํ๋๋ฐ ์ฌ์ ํ ์์ ํ ์ ์๋ค๋ฉด ์ค์๋ก value
๋ฅผ undefined
๋ null
๋ก ์ค์ ํ์ ์ ์์ต๋๋ค.
์๋ ์ฝ๋๊ฐ ์ด๊ฒ์ ๋ณด์ฌ์ค๋๋ค. (์ฒซ ๋ฒ์งธ ์ ๋ ฅ์ ์ ๊ฒจ์์ง๋ง ์ ์ ํ ์ ๋ ฅ์ด ๊ฐ๋ฅํด์ง๋๋ค.)
ReactDOM.createRoot(mountNode).render(<input value="hi" />);
setTimeout(function() {
ReactDOM.createRoot(mountNode).render(<input value={null} />);
}, 1000);
์ ์ด ์ปดํฌ๋ํธ์ ๋์
๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์์ฑํ๊ณ React ์ปดํฌ๋ํธ๋ฅผ ํตํด ๋ชจ๋ ์ ๋ ฅ ์ํ๋ฅผ ์ฐ๊ฒฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ก๋ ์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์ง๋ฃจํ ์ ์์ต๋๋ค. ํนํ ๊ธฐ์กด์ ์ฝ๋๋ฒ ์ด์ค๋ฅผ React๋ก ๋ณ๊ฒฝํ๊ณ ์ ํ ๋๋ React๊ฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ React ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํฉํ๊ณ ์ ํ ๋ ์ง์ฆ๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์ ์ ๋ ฅ ํผ์ ๊ตฌํํ๊ธฐ ์ํ ๋์ฒด ๊ธฐ์ ์ธ ๋น์ ์ด ์ปดํฌ๋ํธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์์ ํ ํด๊ฒฐ์ฑ
์ ํจ์ฑ ๊ฒ์ฌ, ๋ฐฉ๋ฌธํ ํ๋ ์ถ์ ๋ฐ ํผ ์ ์ถ ์ฒ๋ฆฌ์ ๊ฐ์ ์๋ฒฝํ ํด๊ฒฐ์ ์ํ๋ค๋ฉด Formik์ด ๋์ค์ ์ธ ์ ํ ์ค ํ๋์ ๋๋ค. ๊ทธ๋ฌ๋ Formik์ ์ ์ด ์ปดํฌ๋ํธ ๋ฐ state ๊ด๋ฆฌ์ ๊ธฐ์ดํ๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ฐ๋ ๊ฑธ ์ฝ๊ฒ ์๊ฐํ๋ฉด ์ ๋ฉ๋๋ค.