useEffect๋ ์ฝ๋๊ฐ ํ ๋ฒ ๋๋ ํน์ ํ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋์์๋๋ง ์คํ๋๋๋ก ๋์์ค ์ ์๋ function์ ๋๋ค.
useEffect๋ ๋ ๊ฐ์ argument๋ฅผ ๊ฐ์ง๋ function ์
๋๋ค.
์ฒซ ๋ฒ์งธ argument๋ ํ๋ฒ๋ง ์คํํ๊ณ ์ถ์ ํจ์ ์ฝ๋๊ฐ ๋ ๋ฒ์งธ argument์๋ ์ฝ๋์ ํน์ ํ ๋ถ๋ถ์ ๋ณํ๋ฅผ ๊ฐ์ํ๊ณ ๋์์ํค๊ณ ์ถ์ ๋ ๊ฐ์ํด์ค ๊ฐ์ ๋ฃ์ด์ค๋๋ค.
function App() {
const [counter, setValue] = useState(0);
const [keyword, setKeyword] = useState('');
const onClick = () => setValue((prev) => prev + 1)
const onChange = (event) => setKeyword(event.target.value)
// ์นด์ดํธ๋ ํค์๋๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ง๋ค ์คํ๋จ
console.log('im run all the time')
//๐ ๋น ๋ฐฐ์ด ๊ดํธ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ํ์ด์ง๊ฐ ์ฒ์ ๋๋๋ง ๋ ๋๋ง ๋์ํ๊ณ ๋์ด์ ๋์ํ์ง ์์
useEffect(() => {
console.log('only once')
}, [])
//๐ keyword๊ฐ if ์กฐ๊ฑด๋ฌธ์ ๋ง๊ฒ ๋ณ๊ฒฝ๋์์ ๋๋ง ๋์ํจ
useEffect(() => {
if(keyword !== '' && keyword.length > 5) {
console.log('search for', keyword)
}
}, [keyword]) // ๐ ๋ณํ๋ฅผ ๊ฐ์ํ๊ณ ์ถ์ ๊ฐ์ ๋ฐฐ์ด๊ดํธ ์์ ๋ฃ์ด์ค
return (
<div>
<input
value={keyword}
onChange={onChange}
type='text'
placeholder="search here"
/>
<h1>{counter}</h1>
<button onClick={onClick}>click me</button>
</div>
);
}
์์ ์์์์ ์ฒ๋ผ useEffect ๋๋ฒ์งธ argument์ ๋น ๋ฐฐ์ด ๊ดํธ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ํ์ด์ง๊ฐ ๋๋๋ง ๋๋ ์ฒ์๋ง ๋์ํ ํ ๋์ด์ ๋์ํ์ง ์์ต๋๋ค.
useEffect๋ฅผ ์ฐ์ง ์์ console.log('im run all the time')
์ฝ๋๋ ์นด์ดํฐ๊ฐ ๋ฐ๋๊ฑฐ๋ ๊ฒ์์ฐฝ์ ์
๋ ฅ์ ๊ณ์ํด์ ๋์ํ๊ฒ ๋ฉ๋๋ค.
๋ ๋ฒ์งธ ๋ฐฐ์ด ๊ดํธ ์์ ๋ณํ๋ฅผ ๊ฐ์ํ๊ณ ์ถ์ ๊ฐ์ ๋ฃ์ด์ฃผ๊ฒ ๋๋ฉด ํด๋น ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋์๋ง ์ฒซ ๋ฒ์งธ argument๊ฐ ๋์ํ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ useEffect๋ API์ ๊ฐ์ด ๋จ ํ๋ฒ๋ง ๋ถ๋ฌ์ค๊ณ ์ถ์ ๋ด์ฉ์ useEffect ์์ ๋น ๋ฐฐ์ด ๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฒ๋ง ํธ์ถํด ์ค ์์๊ณ , ์ํ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ์ํ๋ ๋์์ ์คํ์ํค๊ณ ์ถ์ ์ํฉ์ ์ ์ฉํ๊ฒ ์ฌ์ฉํด ์ค ์ ์์ต๋๋ค.
cleanup function์ ์ปดํฌ๋ํธ๊ฐ ์์ด์ง ๋, ์ค์ ํด์ค ํจ์๋ฅผ ์คํ์์ผ ์ค ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ์ปดํฌ๋ํธ๊ฐ ์์ด์ง ๋ event listener์ ์ง์์ฃผ๊ฑฐ๋ console.log์ ๋ญ๊ฐ๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ํ ์ ์์ต๋๋ค.
cleanup function์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ useEffect ํจ์์์ return ๊ฐ์ผ๋ก ๋ ๋ค๋ฅธ ํจ์๋ฅผ ๋ด๋ณด๋ด์ฃผ๋ฉด ๋ฉ๋๋ค.
function Hello() {
useEffect(() => {
console.log('hi'); //๐์ฒ์ ์คํ๋ ๊ฐ
return () => console.log('bye'); //๐์ปดํฌ๋ํธ๊ฐ ์์ด์ง ๋ ๋ํ๋ ํจ์ ๊ฐ
}, [])
return (
<h1>hello</h1>
)
}
function App() {
const [showing, setShowing] = useState(false);
const onClick = () => setShowing((prev => !prev))
return (
<div>
{showing ? <Hello /> : null}
<button onClick={onClick}>{showing ? 'hide' : 'show'}</button>
</div>
);
}