set-state-in-render
๋ ๋๋ง ์ค์ ๋ฌด์กฐ๊ฑด state๋ฅผ ์ค์ ํ๋ ๊ฒ์ ๋ํด ๊ฒ์ฆํฉ๋๋ค. ์ด๋ ์ถ๊ฐ ๋ ๋๋ง๊ณผ ์ ์ฌ์ ์ธ ๋ฌดํ ๋ ๋๋ง ๋ฃจํ๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์์ต๋๋ค.
๊ท์น ์ธ๋ถ ์ฌํญ
๋ ๋๋ง ์ค์ ๋ฌด์กฐ๊ฑด setState๋ฅผ ํธ์ถํ๋ฉด ํ์ฌ ๋ ๋๋ง์ด ์๋ฃ๋๊ธฐ ์ ์ ๋ค๋ฅธ ๋ ๋๋ง์ด ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค. ์ด๋ ์ฑ์ ์ถฉ๋์ํค๋ ๋ฌดํ ๋ฃจํ๋ฅผ ์์ฑํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์๋ฐ ์ฌ๋ก
์๋ชป๋ ์์
// โ ๋ ๋๋ง ์ค์ ์ง์ ๋ฌด์กฐ๊ฑด setState
function Component({value}) {
const [count, setCount] = useState(0);
setCount(value); // ๋ฌดํ ๋ฃจํ!
return <div>{count}</div>;
}์ฌ๋ฐ๋ฅธ ์์
// โ
๋ ๋๋ง ์ค์ ํ์
function Component({items}) {
const sorted = [...items].sort(); // ๋ ๋๋ง ์ค์ ๊ณ์ฐ
return <ul>{sorted.map(/*...*/)}</ul>;
}
// โ
์ด๋ฒคํธ ํธ๋ค๋ฌ์์ state ์ค์
function Component() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
{count}
</button>
);
}
// โ
state๋ฅผ ์ค์ ํ๋ ๋์ props์์ ํ์
function Component({user}) {
const name = user?.name || '';
const email = user?.email || '';
return <div>{name}</div>;
}
// โ
์ด์ ๋ ๋๋ง์ props์ state๋ก๋ถํฐ ์กฐ๊ฑด๋ถ๋ก state ํ์
function Component({ items }) {
const [isReverse, setIsReverse] = useState(false);
const [selection, setSelection] = useState(null);
const [prevItems, setPrevItems] = useState(items);
if (items !== prevItems) { // ์ด ์กฐ๊ฑด์ด ์ ํจํ๊ฒ ๋ง๋ญ๋๋ค
setPrevItems(items);
setSelection(null);
}
// ...
}๋ฌธ์ ํด๊ฒฐ
state๋ฅผ prop๊ณผ ๋๊ธฐํํ๊ณ ์ถ์ต๋๋ค
์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ ๋ ๋๋ง ํ state๋ฅผ โ์์ โํ๋ ค๊ณ ์๋ํ๋ ๊ฒ์
๋๋ค. ์นด์ดํฐ๊ฐ max prop์ ์ด๊ณผํ์ง ์๋๋ก ์ ์งํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค.
// โ ์๋ชป๋ ์์: ๋ ๋๋ง ์ค์ ์ ํ
function Counter({max}) {
const [count, setCount] = useState(0);
if (count > max) {
setCount(max);
}
return (
<button onClick={() => setCount(count + 1)}>
{count}
</button>
);
}count๊ฐ max๋ฅผ ์ด๊ณผํ์๋ง์ ๋ฌดํ ๋ฃจํ๊ฐ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
๋์ ์ด ๋ก์ง์ ์ด๋ฒคํธ(state๊ฐ ์ฒ์ ์ค์ ๋๋ ๊ณณ)๋ก ์ด๋ํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค. ์๋ฅผ ๋ค์ด state๋ฅผ ์ ๋ฐ์ดํธํ๋ ์๊ฐ์ ์ต๋๊ฐ์ ์ ์ฉํ ์ ์์ต๋๋ค.
// โ
์
๋ฐ์ดํธํ ๋ ์ ํ
function Counter({max}) {
const [count, setCount] = useState(0);
const increment = () => {
setCount(current => Math.min(current + 1, max));
};
return <button onClick={increment}>{count}</button>;
}์ด์ setter๋ ํด๋ฆญ์ ๋ํ ์๋ต์ผ๋ก๋ง ์คํ๋๊ณ , React๋ ์ ์์ ์ผ๋ก ๋ ๋๋ง์ ์๋ฃํ๋ฉฐ, count๋ ์ ๋ max๋ฅผ ๋์ง ์์ต๋๋ค.
๋๋ฌธ ๊ฒฝ์ฐ์ง๋ง ์ด์ ๋ ๋๋ง์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก state๋ฅผ ์กฐ์ ํด์ผ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ ์กฐ๊ฑด๋ถ๋ก state๋ฅผ ์ค์ ํ๋ ์ด ํจํด์ ๋ฐ๋ฅด์ธ์.