useEffect
: ํน์ ์๊ฐ์ ์คํ๋๋ ๋ฉ์๋๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด Initial Rendering(ํธ๋ฆฌ์ ๋ถ์ ๋, mount)๋ ๋, Re-Rendering๋ ๋, ์ปดํฌ๋ํธ๊ฐ ํธ๋ฆฌ์์ ๋จ์ด์ง ๋(unmount), ์ด๋ค state๊ฐ ๋ฐ๋ ๋(dependency ๋ณ๊ฒฝ)์ ์ฌ์ฉํฉ๋๋ค.
- ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ : ๋ถ์ ํจ๊ณผ๋ฅผ ํฌํจํ ๋ฉ์๋์ ๋๋ค.
- ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ : dependency (ํน์ ์๊ฐ), dependency ๋ฐฐ์ด์ ํฌํจ๋ ์ํ๋ props ์ค ํ๋๋ผ๋ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ฉ์๋๊ฐ ์คํ๋ฉ๋๋ค.
import React, { useEffect, useState } from "react";
function MyComp() {
// ํน์ ์๊ฐ์ ์คํ๋๋ ๋ฉ์๋๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์
useEffect(() => {
console.log("re rendering ๋ ๋๋ง๋ค ์คํ");
});
// ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ ๋น ๋ฐฐ์ด
useEffect(() => {
console.log("์ฒซ ๋ ๋๋ง ๋๋ง ์คํ๋๋ ๋ฉ์๋");
}, []);
// ์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ(ํจ์)์ ๋ฆฌํด์ unmount๋ ๋ ์คํ
useEffect(() => {
return () => {
console.log("์ธ๋ง์ดํธ ๋ ๋ ์คํ๋๋ ๋ฉ์๋");
};
}, []);
// ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ(๋ฐฐ์ด)์ ์์
// ์ด๋ค ๊ฐ(์ฃผ๋ก state, dependency)์ด ๋ฐ๋ ๋,
const [text1, setText1] = useState("");
const [text2, setText2] = useState("");
useEffect(() => {
console.log("dependency text1์ด ๋ฐ๋ ๋");
}, [text1]);
useEffect(() => {
console.log("dependency text2์ด ๋ฐ๋ ๋");
}, [text2]);
useEffect(() => {
console.log("text1 text2๊ฐ ๋ฐ๋ ๋");
}, [text1, text2]);
const [count, setCount] = useState(0);
return (
<div>
hello comp
<button onClick={() => setCount(count + 1)}>CLICK</button>
<div>
<input type="text" onChange={(e) => setText1(e.target.value)} />
</div>
<div>
<input type="text" onChange={(e) => setText2(e.target.value)} />
</div>
</div>
);
}
function App(props) {
const [show, setShow] = useState(true);
return (
<div>
<input
type="checkbox"
checked={show}
onChange={(e) => setShow(e.target.checked)}
/>
{show && <MyComp />}
</div>
);
}
export default App;
Re-rendering ๋ ๋๋ง๋ค ์คํ๋๋ useEffect
: ์ฒซ ๋ฒ์งธ useEffect
๋ ์์กด์ฑ ๋ฐฐ์ด์ ์ ๋ฌํ์ง ์์์ผ๋ฏ๋ก ์ปดํฌ๋ํธ๊ฐ re-rendering ๋ ๋๋ง๋ค ์คํ๋ฉ๋๋ค. ์ด ๋๋ฌธ์ ๋ฒํผ์ ํด๋ฆญํ์ฌ ์ํ๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ์ฝ์์ "re rendering ๋ ๋๋ง๋ค ์คํ"์ด ์ถ๋ ฅ๋ฉ๋๋ค.
์ฒซ ๋ ๋๋ง ๋๋ง ์คํ๋๋ useEffect
: ๋ ๋ฒ์งธ useEffect
๋ ๋น ๋ฐฐ์ด์ ์์กด์ฑ ๋ฐฐ์ด๋ก ์ ๋ฌํ์ฌ, ํด๋น ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ ๋๋ง๋ ๋๋ง ์คํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ํ์ด์ง๊ฐ ์ฒ์ ๋ก๋๋ ๋ ์ฝ์์ "์ฒซ ๋ ๋๋ง ๋๋ง ์คํ๋๋ ๋ฉ์๋"๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
Unmount ๋ ๋ ์คํ๋๋ useEffect
: ์ธ ๋ฒ์งธ useEffect
๋ ํจ์๋ฅผ ๋ฐํํ์ฌ ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋ ๋ ์คํ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ๋ ๋๋ง ์์๋ง ์กด์ฌํ๋ MyComp
์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์์ ์ฌ๋ผ์ง ๋ ์ฝ์์ "์ธ๋ง์ดํธ ๋ ๋ ์คํ๋๋ ๋ฉ์๋"๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
Dependency์ ๋ฐ๋ผ ์คํ๋๋ useEffect
: text1
๊ณผ text2
์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๊ฐ๊ฐ์ useEffect
๊ฐ ์คํ๋ฉ๋๋ค. ๋ํ text1
๊ณผ text2
์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ๋๋ useEffect
๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ฐ input ์์์ ํ
์คํธ๋ฅผ ์
๋ ฅํ ๋๋ง๋ค ์ฝ์์ ํด๋นํ๋ ๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก text1
๊ณผ text2
๋ ๋ค ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ๋๋ useEffect
๋ ์์ผ๋ฏ๋ก, ๋ input ์์์ ํ
์คํธ๋ฅผ ์
๋ ฅํ ๋๋ง๋ค "text1 text2๊ฐ ๋ฐ๋ ๋"๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
๐ข ์ฃผ์ํ ์ : useEffect ๋ด์์ dependency๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
import React, { useEffect, useState } from "react";
function App(props) {
const [count, setCount] = useState(0);
useEffect(() => {
console.log("mount ๋ ๋");
}, []);
useEffect(() => {
console.log("count๊ฐ ๋ณ๊ฒฝ ๋ ๋");
// dependency๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ก ์ฃผ์
// setCount(count + 1); ๋ณ๊ฒฝํ๋ ํจ์ ์์ฑ ๋ถ๊ฐ๋ฅ
}, [count]);
return (
<div>
<button onClick={() => setCount(count + 1)}>click</button>
</div>
);
}
export default App;
์ฒซ ๋ฒ์งธ useEffect
:
[]
์ ์์กด์ฑ ๋ฐฐ์ด๋ก ์ ๋ฌํ์์ผ๋ฏ๋ก, ์ด useEffect
๋ ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ง์ดํธ๋ ๋ ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.๋ ๋ฒ์งธ useEffect
:
[count]
๋ฅผ ์์กด์ฑ ๋ฐฐ์ด๋ก ์ ๋ฌํ์ฌ, count
์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ๋ฉ๋๋ค. ๋ฒํผ์ ํด๋ฆญํ์ฌ count
์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ฝ์์ "count๊ฐ ๋ณ๊ฒฝ ๋ ๋"๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.useEffect
๋ด์์ setCount(count + 1)
๊ณผ ๊ฐ์ด count
๋ฅผ ๋ณ๊ฒฝํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์๋ํ๋ฉด setCount
ํจ์ ํธ์ถ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ก ์ปดํฌ๋ํธ๋ฅผ re-renderํ๊ธฐ ๋๋ฌธ์ ๋ฌดํ ๋ฃจํ์ ๋น ์ง ์ ์์ต๋๋ค.