๐ useEffect
useEffect๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค
ํน์ ์์
์ ์ํํ๋๋ก ์ค์ ํ๋ Hook์
๋๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ์ componentDidMount์ componentDidUpdate๋ฅผ ํฉ์น ํํ๋ก ๋ณด์๋ ๋ฌด๋ฐฉํฉ๋๋ค.
๐ useEffect ํ์ฉ
import { useState, useEffect } from 'react';
const Info = () => {
let [name, setName] = useState('');
let [nickName, setNickName] = useState('');
useEffect(() => {
console.log('๋ ๋๋ง ์๋ฃ');
console.log({
name,
nickName
});
});
const onChangeName = (e) => {
setName(e.target.value);
};
const onChangeNickName = (e) => {
setNickName(e.target.value);
};
return(
<div>
<div>
<input value={name} onChange={onChangeName} />
<input value={nickName} onChange={onChangeNickName} />
</div>
<div>
<p>์ด๋ฆ : </p> {name}
<p>๋๋ค์ : </p> {nickName}
</div>
</div>
)
};
export default Info;
๊ฒฐ๊ณผ๋ฌผ์ ๋ณด๋ฉด console.log์ ๋ฌธ๊ตฌ๊ฐ ๋ ๋ฒ ์ถ๋ ฅ ๋ฉ๋๋ค.
์ด๋ React.StricMode๊ฐ ์ ์ฉ๋ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ๋ฐ์ํ๋ ํ์์
๋๋ค.
useEffect๋ฅผ ์ฌ์ฉํ ์ฝ๋์ ๋ฌธ์ ๊ฐ ์๋์ง ์๋์ง ๊ฐ์งํ๊ธฐ ์ํด ๋ ๋ฒ ์คํ์ด ๋๋ค๊ณ ํฉ๋๋ค.
๐ ๋ง์ดํธ๋ ๋๋ง ์คํํ๊ณ ์ถ์ ๋
useEffect์์ ์ค์ ํ ํจ์๋ฅผ ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋งจ ์ฒ์ ๋ ๋๋ง๋ ๋๋ง ์คํํ๊ณ , ์
๋ฐ์ดํธ๋ ๋๋ ์คํํ์ง ์์ผ๋ ค๋ฉด ํจ์์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ๋น์ด ์๋ ๋ฐฐ์ด
์ ๋ฃ์ด ์ฃผ๋ฉด ๋ฉ๋๋ค.
useEffect(() => {
console.log('๋ ๋๋ง ์๋ฃ');
}, []);
๐ ํน์ ๊ฐ์ด ์ ๋ฐ์ดํธ๋ ๋๋ง ์คํํ๊ณ ์ถ์ ๋
useEffect์์ ํน์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง ํธ์ถํ ๋๋ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋๋ ๋ฐฐ์ด ์์ ๊ฒ์ฌํ๊ณ ์ถ์ ๊ฐ
์ ๋ฃ์ด ์ฃผ๋ฉด ๋ฉ๋๋ค.
useEffect(() => {
console.log(name);
}, [name]);
๋ฐฐ์ด ์์๋ useState๋ฅผ ํตํด ๊ด๋ฆฌํ๊ณ ์๋ ์ํ๋ฅผ ๋ฃ์ด ์ฃผ์ด๋ ๋๊ณ , props๋ก ์ ๋ฌ๋ฐ์ ๊ฐ์ ๋ฃ์ด ์ฃผ์ด๋ ๋ฉ๋๋ค.
๋๋ถ๋ถ์ useEffect๋ฅผ ์ฌ์ฉํ ๋๋ ์ด๋ ๊ฒ ๋ฐฐ์ด์ ์์กดํ๋ ๊ฐ์ ๋ฃ์ด์ค๋๋ค. ๋น ๋ฐฐ์ด์ด๋ ์์กด ๊ฐ์ด ๋ค์ด์๋ ๋ฐฐ์ด์ ๋ฃ๋ ๊ฒฝ์ฐ๋ ์์ด๋, ๋ฐฐ์ด์ ์์ ์๋ตํ๋ ์ํฉ์ ๊ฑฐ์ ์๋ค๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
๐ ๋ท์ ๋ฆฌ(cleanup) ํ๊ธฐ
useEffect๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๋๋ง๋๊ณ ๋ ์งํ๋ง๋ค ์คํ๋๋ฉฐ, ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ ๋ฐฐ์ด์ ๋ฌด์์ ๋ฃ๋์ง์ ๋ฐ๋ผ ์คํ ์กฐ๊ฑด์ด ๋ฌ๋ผ์ง๋๋ค.
์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋๊ธฐ ์ ์ด๋ ์
๋ฐ์ดํธ๊ฐ๋๊ธฐ ์ง์ ์ ์ด๋ ํ ์์
์ ์ํํ๊ณ ์ถ๋ค๋ฉด useEffect์์ ๋ท์ ๋ฆฌ(cleanup)ํจ์๋ฅผ ๋ฐํ
ํด ์ฃผ์ด์ผ ํฉ๋๋ค.
useEffect(() => {
console.log('effect');
console.log(name);
return () => {
console.log('cleanup');
console.log(name);
};
}, [name]);