React๋ ์ปดํฌ๋ํธ๋ณ๋ก(๋ ํธํ๊ฒ)ํจ์๋ฅผ ์งค ์ ์๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ์ ์ฌ์ฌ์ฉ์ ์ ๋ฆฌํ๋ค.
๊ทธ๋ฐ๋ฐ ์์ ๋ฐ์ดํฐ ๊ฐ์ด ๋ฌ๋ผ์ง๋ฉด์ ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฌ์ฉ ๋์์ ๋ ์ ์๋ฏธ ํ์ง ์๊ฒ ๋๊ฐ?
์ฆ, ์ ๋ ฅ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฐํ ์ ์๋ค.
๊ฐ๊ฐ์ ์ปดํฌ๋ํธ์ ์๋ฆฌ์ฆ ์ด๋ฏธ์ง, ์ ๋ชฉ, ์ถ๊ฐ์ฐ๋
์ด๋ ๊ฒ๋ง ๋ฐ์ดํฐ ๊ฐ์ด ๋ฐ๋์ด์ ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฌ์ฉ๋์ด์๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
์ด๊ฒ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋๊ฒ ๋ฐ๋ก Props!
Props๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ ํจ์๊ฐ ์ฌ์ฉ๋ ๋ ํ๋กํผํฐ๋ก ์ฌ์ฉ๋๋ค.
export function TapButton() {
return (
<li>
<button onClick={}>{}</button>
</li>
);
}
// App.js
<TapButton onSelect={() => handleSelect("jsx")}>JSX</TapButton>
์ ์ ์ฝ๋์์ Props๋ ๋ฌด์์๊น?
๋ฐ๋ก Property ํ์์ผ๋ก ๋ค์ด๊ฐ onSelect, JSX์ด๋ค!!
์ฆ, ํ์ ๋จผ์ ๋ง๋ค์ด ๋๊ณ ํด๋น ๊ฐ์ ํ๋กํผํฐ (Props)๋ฅผ ํตํด ์ ๋ฌ์ด ๊ฐ๋ฅํ๋ค. ๋์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค.
๊ทธ๋ผ ์ด๋ ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
export function TapButton(props) {
return (
<li>
<button onClick={props.onSelect}>{props.children}</button>
</li>
);
}
props๋ผ๋ ๊ฐ์ฒด์ ํด๋น ๋ฐ์ดํฐ๋ค์ด ๋ด๊ฒจ์ ธ์จ๋ค ใ ใ
๊ทผ๋ฐ props.children์ด๋ผ๋ ํ๋กํผํฐ๋ ๋ฃ์ด์ค์ ์ด ์๋๋ฐ ์ ๋ค์ด๊ฐ์?
props๋ฅผ ์ด๋ค ์ด๋ฆ์ผ๋ก ์ค์ ํ ์ง๋ ๊ฐ๋ฐ์ ๋ง์์ด๋ค. ใ ใ ๊ทธ๋ฐ๋ฐ ์ด๋ฏธ ์ ํด์ง ๋ ์์ด ์๋ค.
์์๋ฅผ ๋ณด๋ฉด
//React.jsx์์ ์ผ๋ถ
<TapButton onSelect={() => handleSelect("jsx")}>๋์ผ๋</TapButton>
์์ ๋์ผ๋ ๋ถ๋ถ์ ๋ณด๋ฉด ์ปค์คํ ์ปดํฌ๋ํธ์ธ๋ฐ <></>์ฌ์ด์ ๊ฐ์ด ๋ค์ด๊ฐ์๋ค.
์ฌ๊ธฐ์ ๋ค์ด๊ฐ ๊ฐ์ ์๋์ผ๋ก props.children์ ๊ฐ์ผ๋ก ๋ค์ด๊ฐ๊ฒ๋๋ค.
State๋ React์์ ์์ฃผ ์ค์ํ ๋ ์ ์ฉํ ์ญํ ์ ๋ด๋นํ๋ค.
useState๋ผ๋ Hook์ด ๊ด๋ฆฌํ๋ ๋ณ์์ธ State์ ๋ํด ์์๋ณด์!
state๋ useState๋ผ๋ React Hook์ ํตํด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
state๋ ์ปดํฌ๋ํธ ํจ์๋ฅผ ์ฌ์คํ์์ผ์ค ์ ์๋ค.
//App.jsx
const [value,setValue]=useState("์ด๊ธฐ๊ฐ")
๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๊ณ value์๋ ์ด๊ธฐ๊ฐ์ด setValue๋ ํจ์๋ก์ value๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ํจ์์ด๋ค.
์ฃผ์์ฌํญโ
- value์ ์ง์ ์ ๊ทผํ์ฌ ๊ฐ์ ๋ณ๊ฒฝํด์๋ ์๋๋ค
- useState๋ ์ปดํฌ๋ํธํจ์์ ์ต์๋จ์ ์์นํด์ผํ๋ค!
์ผ๋ฐ๋ณ์๋ฅผ ๊ฐ์ด ๋ณ๊ฒฝํ๊ณ ์ด ๊ฐ์ ๋์ ์ผ๋ก ์ปดํฌ๋ํธ์ ๋ฃ์ด์ค๋ค๋ฉด ? ์ด๋ป๊ฒ ๋ ๊น
let value = "init";
return <div>
<h1>{value}</h1>
<button onClick={()=>{value="changed"}}></button>
</div>
์ด๋ button์ ๋๋ฅด๋ฉด value์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ด "changed"๊ฐ ์ฐํ๊ฒ ๋ ๊น?
๊ทธ๋ ์ง ์๋ค!
์ผ๋ฐ๋ณ์๋ ๊ฐ์ด update๋์ด๋ UI๊ฐ Update๋์ง ์๋๋ค.
๊ทธ๋ผ state๋ ??
state์ ๊ฒฝ์ฐ ๊ฐ์ด ๋ณํ๊ฒ ๋๋ฉด useState Hook์ด ์ปดํฌ๋ํธํจ์๋ฅผ ์ฌ๊ฒํ ํ์ฌ ๋ค๋ฅธ ๋ถ๋ถ์ ์๋กญ๊ฒ ๋ ๋๋งํด์ค๋ค.
const [value,setValue]=useState("init")
return <div>
<h1>{value}</h1>
<button onClick={()=>setValue("changed")}></button>
</div>
์ด๋ ๊ฒํ๋ฉด ํด๋น value๋ "changed"๋ก ์ฐํ๊ฒ ๋๋ค!
๊ทธ๋ฐ๋ฐ React๋ก ๊ฐ๋ฐํ๋ค๋ณด๋ฉด ์ด๋ฐ ์ํฉ์ ๋ง์ด ๋ง์ฃผํ๋ค.
์ ์์ ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ๋ค ์ฐ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ๋งํ๋ค.
const [value,setValue]=useState("init")
const change =()=>{
setValue("changed")
console.log(value)
}
return <div>
<h1>{value}</h1>
<button onClick={change}></button>
</div>
์ ์ด๋ฐ ๊ฒฝ์ฐ์ console.log(value)์ ๊ฒฐ๊ณผ๊ฐ์ ์ด๋ค ๊ฐ์ printํ๊ฒ๋ ๊น?
changed๋ฅผ ์์ํ์ง๋ง ์ฌ์ค init์ด ์ฐํ๋ค.
์ด๋ฌํ ์ด์ ๋ ๋ฆฌ์กํธ์ ๋ด๋ถ์๋ฆฌ๋ฅผ ์์์ผํ๋ค.
React๋ State๊ฐ ๋ณ๊ฒฝ๋๋ setValue์ ๊ฐ์ํจ์๋ฅผ ํตํด ํด๋น ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฑฐ๊ฐ์ผ๋ฉด
์ด๋ฏธ ์ค์ผ์ค๋ง์ํ๋ค. "๋ ๋ ๋๋งํ ๋ ๊ฐ ๋ฐ๊ฟ๊บผ์ผ"
๊ทธ๋ฆฌ๊ณ return์์ ์ปดํฌ๋ํธ๋ค์ ๊ทธ๋ฆด ๋ ๊ทธ๋ ํด๋น ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ setValue(๋น๋๊ธฐ)๋ฅผ ๋ง์ฃผํ์๋ ๊ฐ์ด ๋ณํ๋๊ฒ ์๋๋ผ
๋ ๋๋งํ ๋ ๊ฐ์ด ๋ณํ๊ฒ ๋๋ค.
๊ทธ๋์ ์์ง console.log()๋ฅผ ์ฐ์ ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒ์ด ์๋๋ค.
๊ทธ๋ผ ๋ง์ฝ ์ด๋ฐ ์ํฉ๋ ์์ ์ ์๋ค.
๋๋ setValueํ๊ณ ๋ณ๊ฒฝ๋ ๊ทธ ๊ฐ์ ๋ฐ๋ก ์ฌ์ฉํ๊ณ ์ถ์๋ฐ..
์ด๋ฐ ์ํฉ์ ์ํด useEffect Hook์ ์ฌ์ฉํ๋ฉด ๋๋ค.
useEffect๋ ์ปดํฌ๋ํธ๊ฐ ์๋กญ๊ฒ ๋ฆฌํด๋ ๋๋ง๋ค ์๋ํ๋ค. ์ฆ, ๋ฆฌ๋ ๋๋ง์ด ๋ ๋ ์๋ํ๋ ๋ ์์ด๋ค.
์ด๋ฐ ๋ชจ์ต์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ค.
useEffect(์ด๋คํจ์, [])
์ ๊ธฐ ์ []๋ Deps๋ผ๊ณ ํ๊ณ dependency array์ ์ฝ์์ด๋ค.
์์กด์ฑ ๋ฐฐ์ด๋ก์ ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด? UseEffect๋ฅผ ์๋ํ๊ฒ ๋ค~~~ ๋ผ๋๊ฑฐ๋ค.
๋ง์ฝ ๊ทธ ๋ฐฐ์ด์ด ๊บผ์ ธ์๋ค๋ฉด? ์ต์ด์ 1ํ๋ง ์๋์ ํ๊ฒ ๋๋๊ฑฐ๋ค (๋ ๋ณํ๋๊ฒ ์์ผ๋๊น!)
๊ทธ๋์ ๋ง์ฝ ๋ณ๊ฒฝ๋ ๊ฐ์ ์ด์ด์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ฉด๋๋ค.
const [value,setValue]=useState("init")
const change =()=>{
setValue("changed")
}
useEffect(()=>{
console.log(value)
},[value])
return <div>
<h1>{value}</h1>
<button onClick={change}></button>
</div>
์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด value์ ๋ํ ๋ค์ ๊ณผ์ ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋๋ค!!