
1. useEffect ๋?
์ปดํฌ๋ํธ๊ฐ ๋๋๋ง ์ดํ์ ์คํ์ํฌ ํจ์๋ฅผ ์ ์ํ๋ค. useEffect์ effect๋ side-effect๋ผ๋ ๋ป์ด๋ฉฐ, ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋๋๋ง ๋ ํ (main-effect) ์ ํด์ผํ ์์
๋ค์ ๋งํ๋ค. ์ปดํฌ๋ํธ์ ์ ๋ณด๋ฅผ ๋ค๋ฅธ ๋ฐ์ ๊ฐ์ ธ์ ๋์ค์ ๋ด์ฉ์ ์
๋ฐ์ดํธ ํ๋ค๊ฑฐ๋, ๋คํธ์ํฌ ํต์ ๋ฑ์ ์์
์ ํ๋ ์์
๋ค์ ํด๋นํ๋ค. DOM ์
๋ฐ์ดํธ, Browser Paint๊ฐ ์๋ฃ๋ ํ์ UseEffect๊ฐ ํธ์ถ๋๋ค. ์ฐธ๊ณ ๋ก useEffect๋ ํด๋์ค ์ปดํฌ๋ํธ์ componentDidMount, componentDidUpdate ๋ฅผ ํจ์ํ ์ปดํฌ๋ํธ์์ ๊ตฌํํ ๊ฒ์ด๋ค.
2. useEffect ์ฌ์ฉํ๊ธฐ
1) callback
: render()ํจ์๊ฐ ์คํ๋ ๋๋ง๋ค ํธ์ถ๋๋ฉฐ, return ๊ฐ์ผ๋ก clean-up ํจ์๊ฐ ๋ค์ด๊ฐ๋ค.
2) dependency
: Skipping effect๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ฑ๋ฅ ํฅ์์ ์ํด effect๋ฅผ ์ ํ์ ์ผ๋ก ํธ์ถํ๋ ๋ฐฉ๋ฒ์ด๋ค. render() ํจ์๊ฐ ์คํ๋๋ฉด, dependency๋ฅผ ๊ฑฐ์ณ effect๊ฐ ํธ์ถ๋์ด์ผ ํ๋์ง ํ๋ฒ๋ ํํฐ๋งํ๋ค. ๋ณ๊ฒฝ์ ๊ฐ์งํ ๋ณ์๋ค์ ๋ฐฐ์ด์ ๋ด์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ฐ๋ ๊ฐ์ ๋ํ ์ฒ๋ฆฌ๋ง ํ ์ ์๊ฒ ๋๋ค. deps๋ฅผ ์๋ตํ๋ฉด, ์ปดํฌ๋ํธ๊ฐ ๋๋๋ง ๋ ๋ ๋ง๋ค ํธ์ถ๋๋ค. deps๊ฐ ๋น ๋ฐฐ์ด์ด๋ฉด, ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋, ํ ๋ฒ๋ง ์คํ๋๋ฉฐ didMount ์ญํ ๋งํ๊ณ , didUpdate ์ญํ ์ ํ์ง ์๋๋ค.
// ์ปดํฌ๋ํธ๊ฐ ๋๋๋ง ๋ ๋ ๋ง๋ค ํธ์ถ๋๋ค.
useEffect(() => {
console.log("useEffect๊ฐ ์คํ ๋ ๋ ๋ง๋ค ํธ์ถ๋๋ค.")
return () => {
console.log("์๋ก์ด useEffect๊ฐ ์คํ ๋ ๋ ๋ง๋ค ํธ์ถ๋๋ค.")
}
});
// ์ปดํฌ๋ํธ๊ฐ ์ต์ด๋ก ๋ง์ดํธ ๋ ๋๋ง ์คํ๋๋ค.
useEffect(() => {
console.log("useEffect๊ฐ ์คํ ๋ ๋ ๋ง๋ค ํธ์ถ๋๋ค.")
return () => {
console.log("์ปดํฌ๋ํธ ์ ๊ฑฐ๋ ๋ ํธ์ถ๋๋ค.")
}
},[]);
// ์ปดํฌ๋ํธ์ state๊ฐ ๋ฐ๋ ๋ ๋ง๋ค ํธ์ถ๋๋ค.
useEffect(() => {
console.log(`useEffect๊ฐ ์คํ ๋ ๋ ๋ง๋ค ํธ์ถ๋๋ค. newState:${state}`)
return () => {
console.log(`useEffect๊ฐ ์คํ ๋ ๋ ๋ง๋ค ์ด์ ์ effect๋ฅผ ์ ๋ฆฌํ๊ธฐ ์ํด ํธ์ถ๋๋ค.
prevState: ${state} `)
}
},[state]);
3) clean-up ๊ตฌํ
- useEffect๊ฐ ๋ค์ ํ๋ฒ ์คํ๋ ๋, ์ด์ ์ ์คํํ๋ ๊ฒ์ ์ ๋ฆฌํ๊ธฐ ์ํด ๊ตฌํ๋ ํจ์๋ค.
- ํด๋์ค ์ปดํฌ๋ํธ์ componentWillUnMount ์ ๋น์ทํ ๊ธฐ๋ฅ์ ์ํํ๋ค.
- clean-up ํจ์๋ฅผ ํตํด ์ด์ ์ state๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
- ์๋ฅผ ๋ค์ด, ์ปดํฌ๋ํธ๊ฐ API๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ๊ฐ์ ธ์ค๊ณ ์๋๋ฐ, ๋ง์ฝ clean-upํ์ง ์์ผ๋ฉด, ์ปดํฌ๋ํธ๋ ์ฌ๋ผ์ง๋๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ฝ๋๋ ๊ณ์ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ค.
useEffect(() => {
console.log(`effect: ${count}`)
return () => {
console.log(`clean-up: ${count}`)
}
},[count])
์คํ ์์ (ํด๋ฆญ ์ count 1 ์ฆ๊ฐ)
1. effect: 0 (์ฒ์ ๋๋๋ง ๋์ ๋)
2. clean-up: 0 (ํด๋ฆญ ์)
3. effect:1
3) useEffect๋ ์ฌ๋ฌ๊ฐ๋ฅผ ์ ์ธํ ์ ์๋ค.
function FuncComp(props){
useEffect(function(){
console.log("useEffect A")
})
useEffect(function(){
console.log("useEffect B")
})
}'๐ Front > โ๏ธ React JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [styled-components] ํ์ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ๊ธฐ (0) | 2021.09.02 |
|---|---|
| [React Hook ์๋ฆฌ์ฆ 3]: 10๊ฐ์ง Hook๋ค (useMemo, useRef ๋ฑ) (0) | 2021.08.03 |
| [React Hook ์๋ฆฌ์ฆ 1]: ์ฐ๋ ์ด์ , useState() (0) | 2021.07.20 |
| [React Router] ๋ผ์ฐํฐ ์ฌ์ฉํ๊ธฐ(react-router-dom v5) (0) | 2021.07.20 |
| [๋ฆฌ์กํธ ์ผ๋์ฅ]: Component, State, Props (0) | 2021.02.02 |