๊ธฐ์ ๋ฉด์ ์ ๋๋นํด ๊ฐ๋ ์ ๐ฐ ํ์ ํฌ๊ธฐ๋ก ์๋ผ ์ ๋ฆฌํฉ๋๋ค.
๊นํ๋ธ๊ฐ ๊ถ๊ธํ๋ค๋ฉด ๋๋ฌ์ค์ธ์!
๐ ๊นํ๋ธ ๋ณด๋ฌ๊ฐ๊ธฐ (Since 2023.05.10 ~ )
๐ก ํ์ ์ฉ์ด
- Render : DOM Tree๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด ๊ฐ ์๋ฆฌ๋จผํธ์ ์คํ์ผ ์์ฑ์ ๊ณ์ฐํ๋ ๊ณผ์
- Paint : ์ค์ ์คํฌ๋ฆฐ์ Layout์ ํ์ํ๊ณ ์ ๋ฐ์ดํธํ๋ ๊ณผ์
useEffect์ ์ปดํฌ๋ํธ๋ค์ด render์ paint๋ ํ์ ์คํ
๋๋ฉฐ, ๋น๋๊ธฐ์
์
๋๋ค.
paint๋ ํ์ ์คํ๋๊ธฐ ๋๋ฌธ์, useEffect ๋ด๋ถ์ DOM์ ์ํฅ์ ์ฃผ๋ ์ฝ๋๊ฐ ์์ ๊ฒฝ์ฐ ํ๋ฉด ๊น๋นก์ ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
useEffect์ Life cycle
useLayoutEffect์ ์ปดํฌ๋ํธ๋ค์ด render๋ ํ์ ์คํ๋๋ฉฐ, ๊ทธ ํ paint
๋ฉ๋๋ค. ์ฆ ๋๊ธฐ์
์ผ๋ก ์คํ๋ฉ๋๋ค.
paint๊ฐ ๋๊ธฐ ์ ์ ์คํ๋๊ธฐ ๋๋ฌธ์ DOM์ ์กฐ์ํ๋ ์ฝ๋๊ฐ ์กด์ฌํ๋๋ผ๋ ์ฌ์ฉ์๋ ๊น๋นก์์ ๊ฒฝํํ์ง ์์ต๋๋ค.
useLayoutEffect์ Life cycle
useLayoutEffect์ ๋๊ธฐ์ ์ผ๋ก ์คํ๋์ด ๋ด๋ถ ์ฝ๋๊ฐ ๋ชจ๋ ์คํ๋ ํ painting ์์
์ ๊ฑฐ์นฉ๋๋ค. ๋ฐ๋ผ์ ๋ก์ง์ด ๋ณต์กํ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ๋ ์ด์์์ ๋ณด๋๋ฐ๊น์ง ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค๋ ๋จ์ ์ด ์์ด ๋ณดํต์ ๊ฒฝ์ฐ useEffect์ ์ฌ์ฉ์ด ๊ถ์ฅ๋ฉ๋๋ค. ๋ํ์ ์ผ๋ก ๋ฐ์ดํฐ fetch
, event handler
, state reset
์ ๊ฒฝ์ฐ useEffect์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
ํ๋ฉด์ด ๊น๋นก ๊ฑฐ๋ฆฌ๋ ์ํฉ์ผ ๋ ์ ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ด state๊ฐ ์๊ณ , ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฒซ painting ์ ๋ค๋ฅด๊ฒ ๋ ๋๋ง ๋์ด์ผ ํ ๋, useEffect์ ์ฒ์์ 0์ด ๋ณด์ฌ์ง๊ณ re-rendering ๋๋ฉด์ ํ๋ฉด ๊น๋นก์ ํ์์ด ๋ฐ์ํ์ง๋ง, useLayoutEffect์ ์ฝ๋๊ฐ ๋ชจ๋ ์คํ๋ ํ painting ๋๊ธฐ ๋๋ฌธ์ ํ๋ฉด ๊น๋นก์ ํ์์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
const Test = (): JSX.Element => {
const [value, setValue] = useState(0);
useLayoutEffect(() => {
if (value === 0) {
setValue(10 + Math.random() * 200);
}
}, [value]);
console.log('render', value);
return (
<button onClick={() => setValue(0)}>
value: {value}
</button>
);
};
๐ย ์ฐธ๊ณ ๋ฌธ์