::Render -> Effect Callback -> Clean up!
Effect์ดํ ์ผ์ด๋๋ Cleanup Effect๋ฅผ ๋ณด๋ฉด, Cleanup Effect๋ ๊ฐ๋จํ ์ค๋ช
ํ๋ฉด ์ด์ ์ ์ผ์ผํจ Side Effect๋ฅผ ์ ๋ฆฌํ ํ์๊ฐ ์์ ๋ ์ฌ์ฉํ๋ค.
useEffect(() => {
function handleScroll() {
console.log(window.scrollY)
}
document.addEventListener("scroll", handleScroll)
}, [])
์ ์ฝ๋๋ ํ์ด์ง์ ์คํฌ๋กค ์ด๋ฒคํธ๊ฐ ์ผ์ด๋ ๋๋ง๋ค console์ ํ์ฌ ์คํฌ๋กค์ด ์์นํ y์ขํ๋ฅผ ์ถ๋ ฅํ๋ค.
Side Effect์ด๋ฏ๋ก useEffect ์์์ ์ฌ์ฉํ๊ณ , ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ํ ๋ฒ๋ง ๋ฑ๋กํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์์กด์ฑ ๋ฐฐ์ด์๋ ๋น ๋ฐฐ์ด์ ๋ฃ์ด์ค๋ค.
๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์ด ํ์ด์ง๋ฅผ ๋ฒ์ด๋ฌ์ ๋ ์ด ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ๋ ์ด์ ํ์๊ฐ ์์ด์ง ์ ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ์ผ์ผ์ผฐ๋ Effect๋ฅผ ์ ๋ฆฌํด์ค์ผ ํ๋ค. ์ด ๋๋ง๋ค Cleanup Effect๋ฅผ ์ผ์ผํฌ ์ ์๋๋ก useEffect ์์ ํด๋น ๋ก์ง์ ์ ๋ฆฌํ๋ ๋์์ ์ ์ํด๋๋ฉด ๋๋ค.
useEffect(() => {
function handleScroll() {
console.log(window.scrollY)
}
document.addEventListener("scroll", handleScroll)
return () => {
document.removeEventLisnter("scroll", handleScroll)
}
}, [])
์์ ์ฝ๋ ์ค์ ๋ฆฌํด๋ถ๋ถ์ด ๊ทธ์ ํด๋นํ๋ค.
์ฃผ์ํ ์ ์ ๋จ์ ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋๊ณ ์ฌ๋ผ์ง๋ ์์ ์๋ง Cleanup Effect๊ฐ ์คํ๋๋ ๊ฑด ์๋๋ค. ๋ค์ Effect๊ฐ ์ผ์ด๋๊ธฐ ์ ์, ์ด์ Effect์ ์ํฅ์ ์ ๋ฆฌํด์ค์ผ ํ๋ค๋ ์ปจ์
์ ์์์ผ ํ๋ค.
const App = () => {
const [count, setCount] = useState(0);
console.log("render", count);
useEffect(() => {
/* console.log("useEffect Callback", count);
return () => {
console.log("cleanUp", count);
});
}, [count]); */
return <div onClick={() => setCount(count + 1)}>ํ์</div>;
};
export default Foo;
์์ ์ฝ๋์ ์ถ๋ ฅ๊ฐ์
render, 0
useEffect Callback, 0
// ํด๋ฆญ
render, 1
cleanUp, 0
useEffect Callback, 1