State & Props
1. ์์๋ก ์ดํดํ๊ธฐ
State
์ปดํฌ๋ํธ ์ฌ์ฉ ์ค ์ปดํฌ๋ํธ '๋ด๋ถ'์์ ๋ณํ ์ ์๋ ๊ฐ
ex) ๋์ด, ์ฃผ์, ์ทจ์ ์ฌ๋ถ
Props
'์ธ๋ถ'๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๊ฐ
ex) ์ด๋ฆ, ์ฑ๋ณ
2. Props์ ํน์ง
์ปดํฌ๋ํธ์ ์์ฑ (property)
์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ํด๋น ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ง (๋ณํ์ง ์๋) ์์ฑ
๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๊ฐ
React ์ปดํฌ๋ํธ๋ JavaScript ํจ์์ ํด๋์ค๋ก,
props๋ฅผ ํจ์์ ์ ๋ฌ์ธ์์ฒ๋ผ ๋ฐ์ โ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด์ ์ด๋ป๊ฒ ํ์๋๋์ง๋ฅผ ๊ธฐ์ ํ๋ React ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํ
๋ฐ๋ผ์ ์ปดํฌ๋ํธ๊ฐ ์ต์ด ๋ ๋๋ง๋ ๋ ํ๋ฉด์ ์ถ๋ ฅํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ด๊ธฐ๊ฐ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
๊ฐ์ฒด ํํ
์ด๋ค ํ์ ์ ๊ฐ๋ ๋ฃ์ด ์ ๋ฌํ ์ ์์
์ฝ๊ธฐ ์ ์ฉ
ํจ๋ถ๋ก ๋ณ๊ฒฝ๋ ์ ์๋ ์ฝ๊ธฐ์ ์ฉ (read-only)๊ฐ์ฒด
๋ง์ฝ ์ฝ๊ธฐ ์ ์ฉ์ด ์๋๋ผ๋ฉด props๋ฅผ ์ ๋ฌํ ์์ ์ปดํฌ๋ํธ ๊ฐ์ ์ํฅ์ ๋ฏธ์น ์ ์์
๋ํ ์๋์น ์์ side effect์ด๋ React์ ๋จ๋ฐฉํฅ/ํํฅ์ ๋ฐ์ดํฐ ํ๋ฆ ์์น์ ์๋ฐฐ๋จ
3.How to use Props
ํ์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๊ณ ์ ํ๋ ๊ฐ๊ณผ ์์ฑ์ ์ ์
function Parent() {
return (
<div className = 'parent'> // <Parent> ์ ์ธ
<h1>I am the parent</h1>
<Child /> // <Parent> ์ปดํฌ๋ํธ ์์ <Child> ์ปดํฌ๋ํธ ์์ฑ
</div>
);
};
funtion Child() {
return (
<div className = 'Child'>
);
};
props๋ฅผ ์ด์ฉํ์ฌ ์ ์๋ ๊ฐ๊ณผ ์์ฑ์ ์ ๋ฌ
// ์์ฑ ๋ฐ ๊ฐ์ ํ ๋นํจ, ์ ๋ฌํ๊ณ ์ ํ๋ ๊ฐ์ {}๋ก ๊ฐ์ธ์ค
<Child attribute = {value} />
// text ์์ฑ ์ ์ธ ํ, ์ด ์์ฑ์ ๋ฌธ์์ด ๊ฐ์ ํ ๋นํ์ฌ <Child> ์ปดํฌ๋ํธ์ ์ ๋ฌ
<Child text = {'I am the eldest child'} />
//<Parent> ์ปดํฌ๋ํธ์์ ์ ๋ฌํ ๋ฌธ์์ด์ <Child> ์ปดํฌ๋ํธ์์ ๋ฐ์์ด
function Child(props) {
return (
<div className = 'Child'></div>
);
};
์ ๋ฌ๋ฐ์ props๋ฅผ ๋ ๋๋ง
function Child(props) {
// props๋ผ๋ ๊ฐ์ฒด์ {key : value}๋ <Parent> ์ปดํฌ๋ํธ์์ ์ ์ํ {attribute : value} ํํ๋ฅผ ๋
return (
<div className = 'child'>
// JavaScript์ฒ๋ผ props์ value ๋ํ Dot notation์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅ
<p>{props.text}</p>
</div>
);
};
props children
์ฌ๋ ํ๊ทธ์ ๋ซ๋ ํ๊ทธ ์ฌ์ด์ value๋ฅผ ๋ฃ์ด ์ ๋ฌํ๋ ๋ฐฉ๋ฒ๋ ์์
function Parent () {
return (
<div className = 'parent'>
<h1>I am the parent</h1>
<Child>I am the eldest child</Child>
</div>
);
};
function Child(props) {
return (
<div className = 'child'>
<p>{props.children}</p>
</div>
);
};
4. State hook, useState
useState ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ์๋ ๋ฐฉ์
// React๋ก๋ถํฐ useState ๋ถ๋ฌ์ด
import {useState} from 'react';
// useState๋ฅผ ์ปดํฌ๋ํธ ์์์ ํธ์ถ: state ๋ณ์๋ React์ ์ํด ํจ์๊ฐ ๋๋๋ ์ฌ๋ผ์ง์ง ์์
function CheckboxExample() {
// ์๋ก์ด state ๋ณ์ ์ ์ธ
const [isChecked, setIsChecked] = useState(false);
}
useState ์๋์ฝ๋
// useState๋ฅผ ํธ์ถํ๋ฉด ๋ฐฐ์ด์ ๋ฐํํ๋๋ฐ
// ๋ฐฐ์ด์ 0๋ฒ์งธ ์์๋ ํ์ฌ state ๋ณ์, 1๋ฒ์งธ ์์๋ ์ด ๋ณ์๋ฅผ ๊ฐฑ์ ํ๋ ํจ์
// useState์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ๊ฐ์ state์ ์ด๊ธฐ๊ฐ
const [state ์ ์ฅ๋ณ์, state ๊ฐฑ์ ํจ์] = useState(์ํ ์ด๊ธฐ๊ฐ);
useState ๋ฌธ๋ฒ ์์
function CheckboxExample() {
const [isChecked, setIsChecked] = useState(false);
}
// ischecked: state๋ฅผ ์ ์ฅํ๋ ๋ณ์
// setIsChecked: state์ธ isChecked๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์
// useState: state hook
// false: state ์ด๊ธฐ๊ฐ
JSX ์ผํญ์ฐ์ฐ์ ์ฌ์ฉ ์์
<span>{isChecked ? 'Checked!!' : 'Unchecked'} </span>
5. State ๊ฐฑ์ ํ๊ธฐ
๊ฐฑ์ ํ๋ ค๋ฉด state ๋ณ์๋ฅผ ๊ฐฑ์ ํ ์ ์๋ ํจ์์ธ setIsChecked๋ฅผ ํธ์ถ
์ฌ์ฉ์๊ฐ ์ฒดํฌ๋ฐ์ค ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด onchange ์ด๋ฒคํธ๊ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์์ธ handleChecked๋ฅผ ํธ์ถํ๊ณ , ์ด ํจ์๊ฐ setIsChecked ํธ์ถ
setIschecked ํธ์ถ๋๋ฉด ๊ฒฐ๊ณผ์ ๋ฐ๋ผ isChecked ๋ณ์ ๊ฐฑ์
React๋ ์๋ก์ด isChecked ๋ณ์๋ฅผ CheckboxExample ์ปดํฌ๋ํธ์ ๋๊ฒจ, ํด๋น ์ปดํฌ๋ํธ ๋ค์ ๋ ๋๋ง
function CheckboxExample() {
const [isChecked, setIsChecked] = useState(false);
const handleChecked = (event) => {
setIsChecked(event.target.checked);
};
return (
<div className = 'App'>
<input type = 'checkbox' checked = {isChecked} onChange = {handleChecked} />
<span>{isChecked ? 'Checked!!' : 'Unchecked'}</span>
</div>
)
}
6. ์ฃผ์์
React ์ปดํฌ๋ํธ๋ state๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋กญ๊ฒ ํธ์ถ๋๊ณ , ๋ฆฌ๋ ๋๋ง ๋จ
React state๋ ์ํ ๋ณ๊ฒฝ ํจ์ ํธ์ถ๋ก ๋ณ๊ฒฝํด์ผ ํจ, ๊ฐ์ ๋ก ๋ณ๊ฒฝ X
7. ์ด๋ฒคํธ ์ฒ๋ฆฌ
React์์ ์ด๋ฒคํธ๋ camelCase ์ฌ์ฉ
JSX๋ฅผ ์ฌ์ฉํด ๋ฌธ์์ด์ด ์๋, ํจ์๋ก ์ด๋ฒคํธ ์ฒ๋ฆฌ ํจ์ (์ด๋ฒคํธ ํธ๋ค๋ฌ) ์ ๋ฌ
<button onClick = {handleEvent}>Event</button>
onChange
function NameForm() {
const [name, setName] = useState('');
const handleChange = (e) => {
setName(e.target.value);
}
return (
// onChange ์ด๋ฒคํธ ๋ฐ์์, e.target.value๋ฅผ ํตํด ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ด๊ฒจ์๋ input ๊ฐ์ ์ฝ์ด์ฌ ์ ์์
// onChange๋ input์ ํ
์คํธ๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ฐ์ํ๋ ์ด๋ฒคํธ
// ์ด๋ฒคํธ ๋ฐ์์, handleChange ํจ์๊ฐ ์๋ํ๋ฉฐ, ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ด๊ธด input ๊ฐ์ setState๋ฅผ ํตํด ์๋ก์ด state๋ก ๊ฐฑ์
<div>
<input type = 'text' value = {name} onChange = {handleChange}></input>
<h1>{name}</h1>
</div>
)
};
onClick
๋ฒํผ์ด๋ <a>
ํ๊ทธ๋ฅผ ํตํ ๋งํฌ ์ด๋ ๋ฑ ์ฌ์ฉ์์ ํ๋์ ๋ฐ๋ผ ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ฐ์ํด์ผ ํ ๋ ์ฌ์ฉํ๋ ์ด๋ฒคํธ
function NameForm() {
const [name, setName] = useState();
const handleChange = (e) => {
setName(e.target.value);
}
return (
// ๋ฒํผ ํด๋ฆญ ์ input tag์ ์
๋ ฅํ ์ด๋ฆ์ด alert๋ฅผ ํตํด ์๋ฆผ์ฐฝ์ด ํ์
<div>
<input type = 'text' value = {name} onChange = {handleChange}></input>
<button onClick = {alert(name)}>Button</button>
<h1>{name}</h1>
</div>
);
};
Last updated