You might be wondering: why is useState not named createState instead?
โCreateโ wouldnโt be quite accurate because the state is only created the first time our component renders. During the next renders, useState gives us the current state.
์ถ์ฒ: React docs, Using the state hook
ํ์ฌ ์ปดํฌ๋ํธ์ ์ํ ๊ฐ์ ์ค์ ํ๋ useState ํ ๊ณผ ์ฌ์ด๋ ์ดํํธ๋ฅผ ๋ฐ์์ํค๋ useEffect ํ ์ ํํ ์ฌ์ฉํ๋ค.
์ด๋ฐ ํ ๋ค์ ์ด๋ค ํ๋ฆ์ผ๋ก ๋์ํ ๊น? ์ด๋ฒ ํฌ์คํธ์์ ๊ทธ ๋ถ๋ถ์ ๋ํด ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ๋ค.
function App() {
console.log("App render start");
const [show, setShow] = useState(() => {
console.log("App use State hook");
return true;
});
useEffect(() => {
console.log("App use effect hook");
return () => {
console.log("App useEffect Clean Up");
};
}, []);
useEffect(() => {
console.log("App use effect hook, dep [show]");
return () => {
console.log("App useEffect Clean Up, dep [show]");
};
}, [show]);
function handleClick() {
setShow((prev) => !prev);
}
console.log("App render end");
return (
<>
<button onClick={handleClick}>Search</button>
{show && <Child />}
</>
);
}
function Child() {
console.log(" Child render start");
const [text, setText] = useState(() => {
console.log(" Child use state hook");
return "";
});
useEffect(() => {
console.log(" Child use effect hook");
return () => {
console.log(" Child useEffect CleanUp");
};
}, []);
useEffect(() => {
console.log(" Child use effect hook, dep [text]");
return () => {
console.log(" Child useEffect CleanUp, dep [text]");
};
}, [text]);
function handleChange(e) {
setText(e.target.value);
}
const element = (
<>
<input onChange={handleChange} id='input' />
<p>{text}</p>
</>
);
console.log(" Child render end");
return element;
}
๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ์๋ค. App ์ปดํฌ๋ํธ ๋ด๋ถ์์ Child ์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ๋ ํ์์ด๋ค.
๊ฐ๊ฐ์ hook์ด ํธ์ถ๋ ๋๋ง๋ค ์ฝ์ ์ถ๋ ฅ์ ํ๋๋ก ๋ง๋ค์๋ค. ์ด๋ป๊ฒ ์ถ๋ ฅ์ด ๋์ฌ์ง ํ์ธํด๋ณด์.
์ฐธ๊ณ ๋ก ํ ์คํธ๋ React.StrictMode๋ฅผ ์ ์ฉํ์ง ์๊ณ ์งํ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ถ๋ ฅ๊ณผ ๋ ๋๋ง ๊ฒฐ๊ณผ๊ฐ ๋ณด์ธ๋ค. ์ฃผ์ ๊น๊ฒ ๋ณด์์ผ ํ ์ฌํญ์ ๋ ๋๊ฐ ๋๋๊ณ effect ํ ์ด ํธ์ถ๋๋ค๋ ์ ์ด๋ค.
๊ทธ๋ฆฌ๊ณ App ์ปดํฌ๋ํธ ๋ด๋ถ์ Child์ ๋ ๋, ์ดํํธ ์ค์ ์ด ๋๋๊ณ ๋์์ผ App ์ปดํฌ๋ํธ์ ์ดํํธ๊ฐ ์ค์ ๋๋ค.
์ฌ๊ธฐ์ ๋ฒํผ์ ๋๋ฌ Child ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ์ง ์๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
Child๊ฐ ์ฌ๋ผ์ง ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ค. App ์ปดํฌ๋ํธ์ ๋ ๋๊ฐ ๋๋๊ณ ์ฌ์ด๋ ์ดํํธ๊ฐ ์คํ๋๋ค.
์ด๋ ํด๋ฆฐ์ ํจ์๋ฅผ ์ง์ ํด์ฃผ์๊ธฐ ๋๋ฌธ์ ํธ์ถ ์ง์ ํด๋ฆฐ์ ํจ์๊ฐ ์คํ๋์๋ค.
Child๋ ๋์ด์ ๋ ๋๋ง๋์ง ์๊ธฐ ๋๋ฌธ์ ํด๋ฆฐ์ ํจ์๊ฐ ์คํ๋๋ค.
๋ค์์ผ๋ก๋ Child์ text state๊ฐ ๋ณ๊ฒฝ๋ ๋๋ฅผ ๋ณด์.
์ฒซ ๋ ๋๋ง ํ์ Child์ text state๋ฅผ ๋ณ๊ฒฝํ ๋ชจ์ต์ด๋ค.
Child๊ฐ ๋ ๋๋ง๋๊ณ ์ฌ์ด๋ ์ดํํธ๊ฐ ๋ฐ์ํ๋ ์ง๊ด์ ์ธ ๋ชจ์ต์ด๋ค.
ํ ์คํธ๋ฅผ ํตํด ๋ฐ๋ผ๋ณธ useState์ useEffect ํ ํ๋ก์ฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ ์ฒด์ ์ธ ํ๋ก์ฐ๋ ๊ฐ์ง๋ง effect๊ฐ ๋ฑ๋ก๋ ํ ๋ถํฐ๋ ์ฌ์ด๋ ์ดํํธ ๋ฐ์ ์ ํด๋ฆฐ์ ์ด ์คํ๋๋ค๋ ๊ฒ ๋ค๋ฅด๋ค.
ํ ์ ํ๋ฆ์ ์ดํดํ๋ฉด์ ์๋์น ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ง ์๊ฒ ์ฃผ์ํด์ผ๊ฒ ๋ค.