props๋ ์ปดํฌ๋ํธ์ ์ํ๋ ๊ฐ์ ๋๊ฒจ์ค ๋ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก, ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ค.
function App() {
return (
<div>
<Greeting name="React" />
</div>
)
}
App ์ด๋ผ๋ ํจ์ํ ์ปดํฌ๋ํธ์์ Greeting ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋๋ฐ, Greeting ์ปดํฌ๋ํธ์ name ์ด๋ผ๋ ๋ณ์๋ฅผ ๋๊ฒจ์ฃผ๋ ์ํฉ์ด๋ค.
๋ฑ js์์ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ํจ์๋ฅผ ํธ์ถํ ๋ ์ธ์๋ก ๊ฐ์ ๋๊ฒจ์ฃผ์ด ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ, ์ด๋ ๊ฒ ๋ฆฌ์กํธ์์ ์ปดํฌ๋ํธ์ ์ด๋ ํ ๊ฐ์ ๋๊ฒจ์ค ์๊ฐ ์๊ณ ๊ทธ ๊ฐ์ ์ปดํฌ๋ํธ ์ ์ธ๋ถ์์ ์ฌ์ฉํ๊ธฐ ์ํด ์ฐ๋ ๊ฒ์ด props๋ผ๋ ์น๊ตฌ๋ค.
function Greeting(props) {
console.log(props);
return <h2>Hello, {props.name}!</h2>;
}
Greeting ์ปดํฌ๋ํธ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ์ฌ ๋๊ฒจ์ค name ๊ฐ์ ์ฌ์ฉํ ์ ์๋๋ฐ, Greeting ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ด props๊ฐ ์์ <Greeting name="React" />
์์์ฒ๋ผ ์ปดํฌ๋ํธ์ ๋๊ฒจ์ค ๋ณ์๋ค์ ๋ฐ์์ค๋ค.
์ ์ฝ๋๋ฅผ ์คํ์์ผ๋ณด๋ฉด 2๋ฒ์งธ ์ค์ ์จ๋์ console.log(props)์ ์ํด ๋ธ๋ผ์ฐ์ ์ฝ์์ฐฝ์ {name: 'React'} ๋ผ๊ณ ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค. props๋ object์ด๋ค. ์ปดํฌ๋ํธ์ ๋๊ฒจ์ค ๋ณ์๋ค์ ํ๋กํผํฐ๋ก ๊ฐ๋ object์ธ ๊ฒ์ด๋ค.
์ด ์์๋ ๋๊ฒจ์ฃผ๋๊ฒ name ๋ฐ์ ์์ด์ props๊ฐ name์ด๋ผ๋ ํ๋กํผํฐ ํ๋๋ง ๊ฐ๊ณ ์์ง๋ง, ๋ง์ฝ <Greeting name="ํด๋ฏผ์" age=27 job="๋ฐฑ์" />
๋ผ๊ณ ํ๋ค๋ฉด props๋ {name: "ํด๋ฏผ์", age: 27, job: "๋ฐฑ์"} ์ธ object์ผ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ props๋ก ๊ฐ์ ๋ฐ๊ณ ๊ทธ ๊ฐ์ ์ฌ์ฉํ๋ ค๋ฉด js์์ ๊ฐ์ฒด์ ํ๋กํผํฐ์ ์ ๊ทผํ๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ props.๋ณ์๋ช ์ผ๋ก ์ฌ์ฉํ๋ฉด ๋๋๊ฒ์ด๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ ํํ์์ด๊ธฐ ๋๋ฌธ์ { }๋ก ๊ฐ์ธ์ฃผ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์ํ๋๋๋ก ๊ทธ๋๊ทธ๋ ๋ค๋ฅธ ๊ฐ์ ๋๊ฒจ์ค์ผ๋ก์จ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ํ๊ฒ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋๊ฒ props์ธ ๊ฒ์ด๋ค!
๐ props๋ ๊ทธ๋ฅ ๋งค๊ฐ๋ณ์๋ช ์ผ ๋ฟ, ๋ฐ๋์ ์ด๋ฆ์ props๋ก ํด๋ผ! ๋ผ๊ณ ์ ํด์ง๊ฒ ์๋๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ํด๋ ์ ํ ์๊ด์๋ค. ํ์ง๋ง properties์ ์ค์๋ง์ธ props ๋ผ๋ ์ด๋ฆ์ผ๋ก ํ๋๊ฒ ๊ด๋ก์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ props๋ก ํ์
๊ทผ๋ฐ ์ด๋ฐ props๋ ์ฐ๋ฆฌ๊ฐ ์ง์ ๊ฐ์ ๋ณ๊ฒฝํ ์๊ฐ ์๋ค.
function Greeting(props) {
props.name = "๊ฐ๋ฅ์ด";
return <h2>Hello, {props.name}!</h2>;
}
์ด์ ๊ฐ์ด ์ปดํฌ๋ํธ ํจ์ ๋ด์์ props๋ก ๋ฐ์ ๊ฐ์ ์ง์ ์ ์ผ๋ก ๋ณ๊ฒฝํ ์๋ ์๋ค. ๋ฌผ๋ก ํด๋์คํ ์ปดํฌ๋ํธ๋ ๋ง์ฐฌ๊ฐ์ง, ํจ์ํ ํด๋์คํ ๋ญ๋ก ์ ์ธํ๋ props๋ฅผ ์์ ํ ์๋ ์๋ค.
๋ชจ๋ React ์ปดํฌ๋ํธ๋ props์ ๊ด๋ จํ ๋์์ ํ ๋ ์์ ํจ์์ฒ๋ผ ๋์ํด์ผํ๋ค.
์ถ์ฒ : React ๊ณต์๋ฌธ์
props ๊ฐ์ ์ง์ ๋ณ๊ฒฝํ ์๋ ์์ง๋ง, ๊ตณ์ด ๋ฐ์ props๊ฐ์ ๋ณ๊ฒฝํ์ฌ ์ถ๋ ฅํ๊ณ ์ถ๋ค๋ฉด
function Greeting(props) {
const newName = "์กด์ " + props.name;
return <h2>Hello, {newName}!</h2>;
}
์ด์ ๊ฐ์ด ๊ทธ๋ฅ props ๋ณ์์ ๋ค๋ฅธ ๊ฐ์ ๋ถ์ฌ ์๋ก์ด ๋ณ์๋ก ๋ง๋ค๊ณ ๊ทธ ๋ณ์๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค(...)
์ปดํฌ๋ํธ์ ๊ผญ props๋ฅผ ์ง์ ๋๊ฒจ์ฃผ์ง ์๊ณ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ props๋ฅผ ์ง์ ํ ์ ์๋ค. ์ด๋ฅผ default props๋ผ๊ณ ํ๋ค.
์ง์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
Card.defaultProps = {
tags: "๋ํดํธ ํ๋กญ์ค"
}
function Cart({tags}) {
return <h1>{tags}</h1>
์ปดํฌ๋ํธ๋ช .defaultProps์ ์ํ๋ props๋ช ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฐ์ฒด๋ฅผ ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
๊ทธ ๊ฐ์ฒด์ ์ง์ ํ ํ๋กํผํฐ๋ค์ด ํด๋น ์ปดํฌ๋ํธ์ default props๊ฐ ๋๊ณ ์ปดํฌ๋ํธ ํจ์์์ ๋งค๊ฐ๋ณ์๋ก props๋ฅผ ๋ฐ์๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ์์ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ฆฌ์กํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปดํฌ๋ํธ ๋ด์์ ์ ๋์ ์ผ๋ก ๋ฐ๋ ์ ์๋ ๊ฐ์ state ๋ผ๋ ๋ณ์๋ฅผ ์ด์ฉํด์ ์ ์ฅํ๋ค.
์๋ ํจ์ํ ์ปดํฌ๋ํธ์์๋ state ๊ธฐ๋ฅ์ด ์์์ง๋ง Hook ์ด๋ผ๋ ๊ฐ๋ ์ด ๋์ ๋๋ฉด์ ํจ์ํ์์๋ state๋ฅผ ์ธ ์๊ฐ ์๊ฒ ๋์๋ค. ์ฌ๊ธฐ์๋ ํจ์ํ ์ปดํฌ๋ํธ์์์ state ์ฌ์ฉ๋ฒ์ ๋ํด ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
state๋ props์ ๋ง์ฐฌ๊ฐ์ง๋ก js ๊ฐ์ฒด์ด๋ค.
์ผ๋จ state๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด react์ useState๋ฅผ import ํด์ผ ํ๋ค.
import { useState } from 'react'
๊ทธ๋ฆฌ๊ณ console.log(useState(0))
์ด๋ผ๊ณ ํ๋ฉด ์ฝ์์ฐฝ์ Array ๊ฐ์ฒด๊ฐ ๋์จ๋ค. ์ด ๋ฐฐ์ด์ ํผ์ณ๋ณด๋ฉด ์ฒซ๋ฒ์งธ ์์๋ useState์ ์ธ์๋ก ๋๊ฒจ์ค 0์ด ๋ค์ด๊ฐ์๊ณ , ๋๋ฒ์งธ ์์๋ ์ด๋ ํ ํจ์๊ฐ ๋ค์ด๊ฐ์๋ค.
์ด ๋๋ฒ์งธ ์์์ธ ํจ์๊ฐ ๋ฐ๋ก ์ฒซ๋ฒ์งธ ์์์ ๊ฐ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํด์ฃผ๋ ํจ์์ด๋ค(์ด ํจ์๋ฅผ ๋ณดํต "setState ํจ์" ๋ผ๊ณ ์นญํจ).
๊ทธ๋ฆฌ๊ณ ์ฒซ๋ฒ์งธ ์์๊ฐ ์ฐ๋ฆฌ๊ฐ useState์ ์ธ์์ ์ ์ด์ค ๊ฐ์ผ๋ก, state ๋ณ์์ ์ด๊ธฐ๊ฐ์ด ๋๋ค.
์ด๋ฅผ ์ด์ฉํด useState๋ก state ๋ณ์๋ฅผ ์ ์ธํ๋ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
const getState = useState("๊ฐ๋ฅ์ด")
const name = getState[0];
const setName = getState[1];
name ๋ณ์๋ useState("๊ฐ๋ฅ์ด")๊ฐ ๋ฐํํ๋ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์์, ์ฆ useState๋ก ์ง์ ํ ์ด๊ธฐ๊ฐ์ธ "๊ฐ๋ฅ์ด"๊ฐ ๋๊ณ , setName ๋ณ์๋ state ๋ณ์์ธ name์ ๋ณ๊ฒฝ์ํฌ ์ ์๋ setState ํจ์๊ฐ ๋๋ค
const [ name, setName ] = useState("๊ฐ๋ฅ์ด");
useState๊ฐ [ state ๋ณ์ ์ด๊ธฐ๊ฐ, setState ํจ์ ] ํํ์ ๋ฐฐ์ด์ด๊ธฐ ๋๋ฌธ์ ์ด์ฒ๋ผ ๊ตฌ์กฐ ๋ถํด ํ ๋น์ผ๋ก ๋ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์๋ ์๋ค.
props์ ๋ง์ฐฌ๊ฐ์ง๋ก useState์ ๋๋ฒ์งธ ์์์ธ setState ํจ์์ ์ด๋ฆ์ ๋ญ๋ก ํ๋ ์๊ด์ ์์ง๋ง ๋ณดํต ์ง์ ํ ๋ณ์๋ช ์์ set์ ๋ถ์ฌ ์นด๋ฉ์ผ์ด์ค๋ก ์ง๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ฆฌ์กํธ๋ setState ํจ์๋ง์ ํตํด state ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋์ด์๋ค. ์ด setState ํจ์๋ฅผ ์ด์ฉํด state ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง๊ฐ ์๋ค.
setName("๋์ ");
setName((current) => { return "๋์ " });
state ๋ณ์๋ setState ํจ์์ ์ธ์๋ก ๋ค์ด๊ฐ๋ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ์ด ๋๋ค. ๋ฐ๋ผ์ setName("๋์ ") ๋ผ๊ณ ํ๋ฉด name์ ๋์ ๊ฐ ๋๋ค.
์ด๋ ๊ฒ ๋ณ๊ฒฝํ๊ณ ์ ํ๋ ๊ฐ์ ๋ฐ๋ก setState์ ์ธ์๋ก ๋ฃ์ด์ฃผ๋ ๋ฐฉ๋ฒ์ด ์๊ณ ๋๋ฒ์งธ์ฒ๋ผ setState์ ์ธ์๋ก ์ฝ๋ฐฑ ํจ์๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ, setState์ ์ฝ๋ฐฑํจ์๋ ์ธ์๋ก state ๋ณ์์ ํ์ฌ ๊ฐ์ ๊ฐ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ return ์ผ๋ก ๋ฐํ๋ ๊ฐ์ผ๋ก state ๋ณ์์ ๊ฐ์ด ๋ณ๊ฒฝ์ด ๋๋ค.
๋ฐ๋ผ์ setName((current) => { return "๋์ " });
์์ current๋ state ๋ณ์์ ํ์ฌ ๊ฐ์ธ "๊ฐ๋ฅ์ด"๊ฐ ๋๊ณ , ์ฝ๋ฐฑ ํจ์์ ๋ฆฌํด๊ฐ์ธ "๋์ "๋ก state ๋ณ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ด setName("๋์ ")
์ ์๋ฒฝํ๊ฒ ๋์ผํ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก๋ ์์ ํ ๋์ผํ ๋์์ด๊ณ ์ ๋ง ๋ ์ค ๋ญ ์ฌ์ฉํด๋ ์๊ด์ด ์๊ธด ํ์ง๋ง, ์๋ฐํ ๋ฐ์ง์๋ฉด ๋ ๋ฐฉ๋ฒ์ ์ฐจ์ด๊ฐ ์กด์ฌํ๋ค.
์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ state ๋ณ์์ ํ์ฌ ๊ฐ์ด ๋ญ๋ ๊ทธ๋ฅ setState ํจ์์ ์ธ์๋ก ๋ ๋ค ๋ณ๊ฒฝํด๋ฒ๋ฆฌ๋ ์๋จ์๋ค์ด ๋ฐฉ๋ฒ์ด๊ณ , ๋๋ฒ์งธ ๋ฐฉ๋ฒ์ state ๋ณ์์ ํ์ฌ ๊ฐ์ ๊ณ ๋ คํ๋ค๋ ๊ฒ์ด ์ฐจ์ด์ด๋ค.
๋ฌผ๋ก ์์ ์์์์๋ ๋๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก ํด๋ state ๋ณ์์ ํ์ฌ๊ฐ์ธ current๊ณผ๋ ์๊ด์์ด ๊ทธ๋ฅ ๋ฐ๋ก return ๊ฐ์ "๋์ "๋ก ๋ฐ์๋ฒ๋ ค์ ์๋ฏธ์๊ธด ํ๋ค.
ํ์ง๋ง state ๋ณ์์ ํ์ฌ ๊ฐ์ด ๋ญ์ง์ ๋ฐ๋ผ์ ๋ฐ๊ฟ ๊ฐ์ด ๋ฌ๋ผ์ง๋ค๊ฑฐ๋ state ๋ณ์์ ํ์ฌ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ก์ด ๊ฐ์ ๋ง๋ค์ด์ผ ํ๋ค๊ฑฐ๋ ๋ญ ์ด๋ ๊ฒ state ๋ณ์์ ํ์ฌ ๊ฐ์ ๊ณ ๋ คํด์ผ ํ๋ ์ํฉ๋ ์์ ์๊ฐ ์๊ธฐ ๋๋ฌธ์, ์ด๋ฐ ๊ฒฝ์ฐ์๋ ๋๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ฐ๋ฉด ๋๋ค.
์๋ฌดํผ state ๋ณ์์ ํ์ฌ ๊ฐ์ ๊ณ ๋ คํ๋๋ ์๋๋์ ์ฐจ์ด์ธ ๊ฒ์ด๊ณ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์์๋ ๋์ค ๋ญ ์ฌ์ฉํด๋ ์๊ด์์ ๊ฒ์ด๋ค.
๋ฆฌ์กํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปดํฌ๋ํธ ๋ด์์ ์ ๋์ ์ผ๋ก ๋ฐ๋ ์ ์๋ ๊ฐ์ state ๋ผ๋ ์ ๋ฅผ ์ด์ฉํด์ ์ ์ฅํ๋ค.
state ํํธ์์ ์ฒ์ ํ ๋ง์ด๋ค.
state ๋ณ์๊ฐ ๋ญ์ง ์๊ฒ ๊ณ , setState ํจ์๋ก ๊ฑ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ๋ ์ด์ ์๊ฒ ๋๋ฐ ๊ทธ๋ผ ์ ๊ทธ๋ฅ ๋ณ์ ์์ฐ๊ณ ๊ตณ์ด state ๋ณ์๋ฅผ ์จ๊ฐ์ง๊ณ ๋ณ๊ฒฝ๋ setState ํจ์๋ฅผ ํตํด์ ํด์ผํ๋ ๊ท์ฐฎ์ ๋ฐฉ์์ ํํด์ผ ๋๋๊ฑฐ์? ์ด๋ผ๊ณ ๋ฌผ์ ์ ์๋ค.
๋ฆฌ์กํธ์์ ์ปดํฌ๋ํธ ๋ด์์ state ๋ณ์๋ฅผ ์ฐ๋ ์ด์ ๋ ๋ฆฌ๋ ๋๋ง(re-rendering) ์ด๋ผ๊ณ ์๊ฐํ๋ค.
(๋ฌผ๋ก ๋ด ๋ํผ์
์ด๋ค)
๋ฆฌ์กํธ๋ state ๋ณ์๊ฐ ๋ฐ๋๋ฉด ์๋์ผ๋ก ํด๋น ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง์ด ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ปดํฌ๋ํธ ๋ด์์ ์ด๋ ํ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค๋๊ฑด ํด๋น ๋ณ์์ ๋ด์ฉ์ ํ๋ฉด์์ ์ถ๋ ฅํ๋ ๊ทธ ๋ณ์๋ก ์ด๋ ํ ์ํ๋ฅผ ๋์ถํด๋ด์ ๊ทธ๊ฑธ ํ๋ฉด์์ ์ถ๋ ฅํ๋ ํ๊ธฐ ์ํจ์ผ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ณ์์ ๊ฐ์ ๋ฐ๊พผ๋ค๋๊ฑด ํ๋ฉด์์ ์ถ๋ ฅํ ๋ณ์, ํน์ ์ด๋ค ์ํ์ ๊ฐ์ ์๋ก ๋ฐ๋ ๊ฐ ํน์ ์ํ๋ก ๋ฐ๊ฟ ๋ณด์ฌ์ฃผ๊ฒ ๋ค๋ ์๋ฏธ์ผ ๊ฒ์ด๋ค(์๋ ๋ง๊ณ ).
๊ทธ๋ฐ ๊ด์ ์์ ๋ณด๋ฉด ๋ฆฌ์กํธ๋ state ๋ณ์๊ฐ ๋ฐ๋๋ฉด ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋ง, ์ฆ ๋ฐ๋ ๋ณ์๊ฐ์ด ๋์ค๊ฒ ์์์ ๊ฐฑ์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ๋ง์ผ๋ก state ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ๊ด๋ฆฌํ๋๊ฑด ์์ฃผ ํฉ๋ฆฌ์ ์ด๋ค.
state๋ฅผ ๋ณ๊ฒฝํ๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ ์์ ์ธ๊ธํ๋ฏ์ด ๋ฆฌ์กํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก state ๋ณ์์ ๊ฐ์ setState ํจ์๋ง์ ํตํด ๋ณ๊ฒฝํ ์ ์๊ฒ ํ๋ค. ์ด๋ state ๋ณ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋, ์ฆ ์ปดํฌ๋ํธ์ ์ํ(state)๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ฆฌ์กํธ์๊ฒ ๋ฆฌ๋ ๋๋ง์ ํ๋ผ๋ ๋ช ๋ น์ ์์ฒญํ๊ธฐ ์ํจ์ด๋ค.
๋ค์๋งํด, setState ํจ์๋ฅผ ์ด์ฉํด์ผ ๋ฆฌ์กํธ๊ฐ ์ปดํฌ๋ํธ์ ์ํ๊ฐ ๋ฐ๋์๋ค๋ผ๋ ๊ฒ์ ์ธ์ํ ์ ์๊ณ ์ปดํฌ๋ํธ๋ฅผ ์ต์ ์ํ๋ก ๊ฐฑ์ ์์ผ์ค๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ธฐ๋๋ฌธ์ setState ํจ์๋ก ๊ฐ์ ๋ณ๊ฒฝํด์ผ๋ง ํ๋ state ๋ณ์๋ฅผ ์ฐ๋ฆฌ๊ฐ ๊ตณ์ด๊ตณ์ด ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์ดํดํ ์ ์๊ฒ ๋ค.
์๋ฌดํผ ์ค์ํ๊ฑด state ๋ณ์๋ setter ํจ์๋ก ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๊ณ , state ๋ณ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๋ง ๋๋ค! ๋ผ๋๊ฑฐ๋ค ๐
state ๋ณ์๊ฐ ๊ฐ์ฒด๋ผ๋ฉด ์ฃผ์ํด์ผ ํ ์ ์ด ํ๋ ์๋ค.
const [ user, setUser ] = useState({ name: "ํด๋ฏผ์", age: 27, job: "๋ฐฑ์" });
setUser(current => {
current.job = "FE ์ ์
๊ฐ๋ฐ์";
return current;
});
user๋ผ๋ state ๋ณ์๋ฅผ { name: "ํด๋ฏผ์", age: 27, job: "๋ฐฑ์" } ๋ผ๋ ๊ฐ์ฒด๋ก ๋ง๋ค์๋ค.
๊ทธ๋ฆฌ๊ณ setUser์ ์ธ์๋ก ์ฝ๋ฐฑํจ์๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ์ผ๋ค.
ํ์ฌ state ๋ณ์์ธ ๊ฐ์ฒด์ job ํ๋กํผํฐ๋ฅผ "FE ์ ์ ๊ฐ๋ฐ์"๋ก ๋ฐ๊พธ๊ณ ๋ฐ๋ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ ํจ์์ด๋ฏ๋ก ๊ฒฐ๊ณผ์ ์ผ๋ก setUser ํจ์์ ์ธ์๋ก job ํ๋กํผํฐ๊ฐ ๋ฐ๋ ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ๋ ๊ผด์ด๋ ์์์ ์ดํด๋ณธ setState ํจ์์ ๊ฐ๋ ๋๋ก๋ผ๋ฉด ์ ํ ๋ฌธ์ ์์ด ๋ณด์ธ๋ค.
ํ์ง๋ง ์ํ๊น๊ฒ๋ ์ด๋ ๊ฒ ํ๋ฉด ๋ฆฌ์กํธ๊ฐ state์ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ง ๋ชปํด ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋์ง ์๋๋ค.
๊ฐ์ฒด ์์ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋์์ ๋ฟ, ๊ฐ์ฒด ์์ฒด๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ข ์์ํ ๊ด์ ์ผ ์ ์๋๋ฐ ์๋ฅผ๋ค๋ฉด ์ฌ๊ณผ, ๋ฐฐ, ์ค๋ ์ง๊ฐ ๋ค์ด์๋ ์์๊ฐ ํ๋ ์๊ณ ์ด ์์๋ ๋ด๋ถ๊ฐ ๋ณด์ด์ง ์๊ฒ ๋ซํ์๋ค. ์ฐ๋ฆฌ๋ ์ด ์์์ ๊ฒ๋ชจ์ต๋ง์ ๋ณผ ์ ์๋ค๊ณ ๊ฐ์ ํ์.
์ฐ๋ฆฌ๋ ์ด ์์ ์์ ํ์ฌ ๊ณผ์ผ๋ณ๋ก ๋ช๊ฐ๊ฐ ๋ค์ด์๋์ง๋ ์๊ณ ์๋ ์ํฉ์ธ๋ฐ ๋๊ตฐ๊ฐ๊ฐ ๋ชฐ๋ ์ฌ๊ณผ ํ๋๋ฅผ ๋ฐฐ๋ก ๋ฐ๊พธ๊ณ ๋ค์ ์์๋ฅผ ๋ซ์๋์๋ค๊ณ ํ์.
์ค์ ๋ก๋ ์ฌ๊ณผ์ ๊ฐ์๋ ํ๋ ์ค๊ณ ๋ฐฐ์ ๊ฐ์๊ฐ ํ๋ ๋์ด์ ์์์ ์ํ๊ฐ ๋ฐ๋ ์ํฉ์ธ๋ฐ ์ฐ๋ฆฌ๋ ๋ซํ ์์์ ๊ฒ๋ชจ์ต๋ง์ ๋ณด๊ณ ์๋ ์ด๋ฅผ ์์์ฐจ๋ฆด ์ ์๋ค.
์ด์ฒ๋ผ ๋ฆฌ์กํธ๋ก ๊ฐ์ฒด์ ํ๋กํผํฐ๊ฐ ๋ฐ๋์๋ค ํด๋ ๊ฐ์ฒด ์์ฒด๊ฐ ๋ฐ๋์๋ค๋ ๊ฒ์ ์ธ์ํ์ง ๋ชปํ๋ค.
๋๋ฌธ์ ํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ ํ๋๊ฒ ์๋ ์์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ผ ๋ฆฌ์กํธ๊ฐ ๋ณํ๋ฅผ ์ธ์ํ ์ ์๋ค.
const [ user, setUser ] = useState({ name: "ํด๋ฏผ์", age: 27, job: "๋ฐฑ์" });
setUser(current => {
const newUser = { ...current };
newUser.job = "FE ์ ์
๊ฐ๋ฐ์";
return newUser;
});
ํ์ฌ์ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํด ๊ทธ์ ๋์ผํ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๊ทธ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ๋ค ๊ฑ๋ฅผ setState์ ์ธ์๋ก ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค. ๊ธฐ์กด์ ๊ฐ์ฒด์ ๋ค๋ฅธ ๋ณ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ๊ฐ ๋ณํ๋ฅผ ์ธ์ํ๋ค.
์ฝ๊ฐ ์์๋ณต์ฌ, ๊น์๋ณต์ฌ์ ๊ฐ๋ ๊ณผ ๋น์ทํ ๊ฑฐ ๊ฐ๋ค. ์๋ณต์ ํ๋ฉด ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ด ๋์ผํ๋ ๊ฐ์ฒด์ ๋ณํ๊ฐ ๊ธฐ์กด๊ฐ์ฒด, ๋ณต์ฌํ๊ฐ์ฒด ๋ชจ๋์์ ์ผ์ด๋๊ณ ๊น๋ณต์ ํด์ ์ฃผ์๊ฐ์ด ๋ฌ๋ผ์ผ ๊ธฐ์กด ๊ฐ์ฒด์ ๋ค๋ฅธ ๋ณ๊ฐ์ ๊ฐ์ฒด๋ก ์ธ์์ด ๋๋๊ฒ์ฒ๋ผ
๋ฆฌ์กํธ๋ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถํ๋๊ฑด ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ด๊ธฐ ๋๋ฌธ์ ํ์ฌ ๊ฐ์ฒด์ ๋ด์ฉ์ ๋ฐ๊ฟ๋ดค์ ๊ทธ ๊ฐ์ฒด ๊ณ ์ ์ ์ฃผ์๊ฐ์ ๋ณํ์ง ์์ผ๋ ๊ทธ ๊ฐ์ฒด ์์ฒด๋ ๊ทธ๋๋ก์ธ ๊ฒ์ผ๋ก ์ธ์์ด ๋๋๊ฒ ๊ฐ๋ค๊ณ ๋ฉ๋๋ก ๋ฉ๋ํด๋ฒ๋ ธ๋ค.
๊ทธ๋์ ์์ ์์์์๋ newUser = current ๋ผ๊ณ ํ์ง ์๊ณ spread ์ฐ์ฐ์๋ฅผ ํตํด ๊น๋ณต์ ํด์ค๊ฒ์ด ์๋๊ฐ! newUser = current ๋ผ๊ณ ํ๋ฉด ์๋ง ๋๊ฐ์ด ์๋ ๊ฑฐ๋ค.
(spread ์ฐ์ฐ์๋ 1์ฐจ์ ๊น์ด์ธ ๊ฐ์ฒด(๋ฐฐ์ด)๋ ๊น์๋ณต์ฌ๋ฅผ ํด์ค๋ค๊ณ ์๊ณ ์์)
์ํผ ๊ฐ์ฒด ์ํ์ state๋ฅผ ์ฌ์ฉํ ๋ ์ด ์ ์ ์ฃผ์ํ๋๋ก ํ์ โ
์ฐธ๊ณ ์๋ฃ
https://reactjs-kr.firebaseapp.com/docs/components-and-props.html
https://onlyfor-me-blog.tistory.com/463#google_vignette
https://yung-developer.tistory.com/96