| title | set-state-in-effect |
|---|
Effect์์ setState๋ฅผ ๋๊ธฐ์ ์ผ๋ก ํธ์ถํ๋ ๊ฒ์ ๋ํด ๊ฒ์ฆํฉ๋๋ค. ์ด๋ ์ฑ๋ฅ์ ์ ํ์ํค๋ ์ฌ๋ ๋๋ง์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
Effect ๋ด๋ถ์์ ์ฆ์ state๋ฅผ ์ค์ ํ๋ฉด React๊ฐ ์ ์ฒด ๋ ๋๋ง ์ฌ์ดํด์ ๋ค์ ์์ํด์ผ ํฉ๋๋ค. Effect์์ state๋ฅผ ์ ๋ฐ์ดํธํ๋ฉด React๋ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํ๊ณ , DOM์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ ๋ค์, Effect๋ฅผ ๋ค์ ์คํํด์ผ ํฉ๋๋ค. ์ด๋ ๋ ๋๋ง ์ค์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๊ฑฐ๋ props์์ state๋ฅผ ํ์์์ผ ํผํ ์ ์์๋ ์ถ๊ฐ ๋ ๋๋ง ํจ์ค๋ฅผ ์์ฑํฉ๋๋ค. ๋์ ์ปดํฌ๋ํธ์ ์ต์์ ๋ ๋ฒจ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ์ธ์. ์ด ์ฝ๋๋ ์ถ๊ฐ ๋ ๋๋ง ์ฌ์ดํด์ ํธ๋ฆฌ๊ฑฐํ์ง ์๊ณ props๋ state๊ฐ ๋ณ๊ฒฝ๋ ๋ ์์ฐ์ค๋ฝ๊ฒ ๋ค์ ์คํ๋ฉ๋๋ค.
Effect์์ ๋๊ธฐ์ ์ผ๋ก setState๋ฅผ ํธ์ถํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ธํธํ๊ธฐ ์ ์ ์ฆ์ ์ฌ๋ ๋๋ง์ด ํธ๋ฆฌ๊ฑฐ๋์ด ์ฑ๋ฅ ๋ฌธ์ ์ ์๊ฐ์ ๋๊น์ด ๋ฐ์ํฉ๋๋ค. React๋ ๋ ๋ฒ ๋ ๋๋งํด์ผ ํฉ๋๋ค. ํ ๋ฒ์ state ์
๋ฐ์ดํธ๋ฅผ ์ ์ฉํ๊ณ , ๋ ํ ๋ฒ์ Effect๊ฐ ์คํ๋ ํ์
๋๋ค. ๋จ์ผ ๋ ๋๋ง์ผ๋ก ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ ๋ ์ด๋ฌํ ์ด์ค ๋ ๋๋ง์ ๋ญ๋น์
๋๋ค.
๋ง์ ๊ฒฝ์ฐ Effect๊ฐ ์ ํ ํ์ํ์ง ์์ ์๋ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ Effect๊ฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์ด ๊ท์น์ ๋๊ธฐ์ ์ผ๋ก setState๊ฐ ๋ถํ์ํ๊ฒ ์ฌ์ฉ๋๋ ์ฌ๋ฌ ํจํด์ ๊ฐ์งํฉ๋๋ค.
- ๋ก๋ฉ ์ํ๋ฅผ ๋๊ธฐ์ ์ผ๋ก ์ค์
- Effect์์ props๋ก๋ถํฐ state ํ์
- ๋ ๋๋ง ๋์ Effect์์ ๋ฐ์ดํฐ ๋ณํ
์ด ๊ท์น์ ๋ํ ์๋ชป๋ ์ฝ๋ ์์์ ๋๋ค.
// โ Effect์์ ๋๊ธฐ์ ์ผ๋ก setState
function Component({data}) {
const [items, setItems] = useState([]);
useEffect(() => {
setItems(data); // ์ถ๊ฐ ๋ ๋๋ง, ๋์ ์ด๊ธฐ ์ํ๋ฅผ ์ฌ์ฉํ์ธ์
}, [data]);
}
// โ ๋ก๋ฉ ์ํ๋ฅผ ๋๊ธฐ์ ์ผ๋ก ์ค์
function Component() {
const [loading, setLoading] = useState(false);
useEffect(() => {
setLoading(true); // ๋๊ธฐ์ , ์ถ๊ฐ ๋ ๋๋ง ๋ฐ์
fetchData().then(() => setLoading(false));
}, []);
}
// โ Effect์์ ๋ฐ์ดํฐ ๋ณํ
function Component({rawData}) {
const [processed, setProcessed] = useState([]);
useEffect(() => {
setProcessed(rawData.map(transform)); // ๋ ๋๋ง ์ค์ ์์ฑํด์ผ ํจ
}, [rawData]);
}
// โ props๋ก๋ถํฐ state ํ์
function Component({selectedId, items}) {
const [selected, setSelected] = useState(null);
useEffect(() => {
setSelected(items.find(i => i.id === selectedId));
}, [selectedId, items]);
}์ด ๊ท์น์ ๋ํ ์ฌ๋ฐ๋ฅธ ์ฝ๋ ์์์ ๋๋ค.
// โ
๊ฐ์ด ref์์ ์ค๋ ๊ฒฝ์ฐ Effect์์ setState๋ ๊ด์ฐฎ์ต๋๋ค
function Tooltip() {
const ref = useRef(null);
const [tooltipHeight, setTooltipHeight] = useState(0);
useLayoutEffect(() => {
const { height } = ref.current.getBoundingClientRect();
setTooltipHeight(height);
}, []);
}
// โ
๋ ๋๋ง ์ค์ ๊ณ์ฐ
function Component({selectedId, items}) {
const selected = items.find(i => i.id === selectedId);
return <div>{selected?.name}</div>;
}๊ธฐ์กด props๋ state๋ก๋ถํฐ ๊ณ์ฐํ ์ ์๋ ๊ฒฝ์ฐ state์ ๋ฃ์ง ๋ง์ธ์. ๋์ ๋ ๋๋ง ์ค์ ๊ณ์ฐํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๊ฐ ๋ ๋น ๋ฅด๊ณ ๊ฐ๋จํ๋ฉฐ ์ค๋ฅ๊ฐ ๋ ๋ฐ์ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ Effect๊ฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์ฐธ๊ณ ํ์ธ์.