React Hook - useEffect
๐ฌ useEffect๋?
- ์ด๋ ํ ์ปดํฌ๋ํธ๊ฐ Mount, Update, Unmount ๋์์ ๋ ํน์ ์์ ์ ์คํ
- ์ธ์๋ก๋ ์ฝ๋ฐฑํจ์(Callback Function)์ ๋ฐ์
- Mount : ํ๋ฉด์ ์ฒซ ๋ ๋๋ง
- Update : ๋ค์ ๋ ๋๋ง
- Unmount : ํ๋ฉด์์ ์ฌ๋ผ์ง ๋
๐ useEffect ์ฌ์ฉํ๊ธฐ
App.js
1. ์ฐ์ useEffect ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด import๋ฅผ ์์ผ์ค์ผํ๋ค.
import { useEffect } from 'react';
2. ๊ธฐ๋ณธ์ ์ธ useEffect ๋ฌธ๋ฒ์ 2๊ฐ์ง ํํ๊ฐ ์๋ค.
// 1๋ฒ
useEffect(() => {/* ์์
.. */});
// 2๋ฒ
useEffect(() => {/* ์์
.. */}, [value]);
1๋ฒ useEffect๋ ํ๋ฉด์ด ๋๋๋ง ๋ ๋๋ง๋ค ์คํ
2๋ฒ useEffect๋ ํ๋ฉด์ด ์ฒซ ๋ ๋๋ง ๋ ๋ ์คํํ๋ฉฐ, value ๊ฐ์ด ๋ฐ๋ ๋ ์คํ
(value๊ฐ์ด ๋น ๋ฐฐ์ด์ด๋ฉด ํ๋ฉด์ ์ฒซ ๋ ๋๋ง ๋ ๋๋ง ์คํ)
(์ด value๋ฅผ Dependency Array๋ผ๊ณ ๋ถ๋ฆ)
๐ฅ useEffect ์์
์ฒซ ๋ฒ์งธ ์์๋ ๋ฒํผ ํด๋ฆญ์ 1์ฉ ์ฆ๊ฐํ๋ ๋ํ์ ์ธ Counter ์์์,
input์ value๋ฅผ ๋ฐ์ ํ๋ฉด์ ๋์ด์ฃผ๋ ์์์ด๋ค.
UseEffect.js
import React, { useState, useEffect } from 'react';
const UseEffect = () => {
const [count, setCount] = useState(1);
const [name, setName] = useState("");
const handleClick = () => {
setCount(count + 1);
}
const handleInputChange = (e) => {
setName(e.target.value);
}
// ๋๋๋ง ๋ ๋๋ง๋ค ๋งค๋ฒ ์คํ
useEffect(() => {
console.log('๋๋๋ง ์๋ฃ');
});
return (
<div>
<button onClick={handleClick}>Update</button>
<span>Count : {count}</span>
<div>Name : {name}</div>
<input type="text" value={name}
onChange={handleInputChange}/>
</div>
);
};
export default UseEffect;
์คํํ๋ฉด โจ
useEffect์ Dependency Array๊ฐ ์์ด
Count, Input State๊ฐ ๋ฐ๋ ๋๋ง๋ค useEffect๊ฐ ํธ์ถ๋๋ค.
๋ง์ฝ ์ํ๋ State๊ฐ ๋ณ๊ฒฝ ๋ ๋๋ง๋ค ์ฝ๋๋ฅผ ์คํ์์ผ์ผ ํ๋ค๋ฉด?
- Dependency Array์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
// Count๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ
useEffect(() => {
console.log('๐ฅ Count Effect');
}, [count]);
// Name์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ
useEffect(() => {
console.log('๐ Name Effect');
}, [name]);
// ์ฒซ ๋๋๋ง ๋ ์คํ
useEffect(() => {
console.log('๐ฌ ์ฒ์ ๋ ๋๋ง Effect!');
}, []);
์คํํ๋ฉด โจ
๐ฅ useEffect & Clean up ์์
useEffect & clean up ์์๋ ๋ฒํผ์ ํด๋ฆญํ๋ฉด console์ ํ์ด๋จธ๊ฐ 1์ด๋ง๋ค ์คํ๋๋ฉฐ,
Effect_Timer๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ Mount๋ Unmount ์์ผ์ค๋ค.
UseEffect.js
import React, { useState, useEffect } from 'react';
import Effect_Timer from './component/Effect_Timer';
const UseEffect = () => {
const [showTimer, setShowTimer] = useState(false);
const handleShowTimer = () => {
setShowTimer(!showTimer)
}
return (
<div>
{showTimer && <Effect_Timer />}
<button onClick={handleShowTimer}>Toggle Timer</button>
</div>
);
};
export default UseEffect;
Effect_Timer.js
import React, { useEffect } from 'react';
const Effect_Timer = () => {
useEffect(() => {
const timer = setInterval(() => {
console.log("ํ์ด๋จธ ์คํ๋๋์ค...");
}, 1000)
}, []);
return (
<div>
<span>ํ์ด๋จธ๋ฅผ ์์ํฉ๋๋ค. ์ฝ์์ ๋ณด์ธ์.</span>
</div>
);
};
export default Effect_Timer;
์คํํ๋ฉด โจ
์คํํ๋ฉด์ ๋ณด๋ฉด Toggle Timer ๋ฒํผ์ ๋ค์ ๋๋ฌ๋ ํ์ด๋จธ๊ฐ ๊ณ์ ์คํ๋๋ค.
๊ทธ ์ด์ ๋ Effect_Timer ์ปดํฌ๋ํธ ๋ด์์ UseEffect๋ฅผ ๋ณด๋ฉด
Effect_Timer.js
useEffect(() => {
const timer = setInterval(() => {
console.log("ํ์ด๋จธ ์คํ๋๋์ค...");
}, 1000)
}, []);
Timer๋ฅผ ๋ง๋ค์๋๋ฐ ์ข ๋ฃ ์์ผ์ค ์ฝ๋๋ฅผ ์์ฑํ์ง ์์๋ค.
์ข ๋ฃ ์์ผ์ค ์ฝ๋๋ useEffect์ return์ผ๋ก ์์ฑํ๋ฉด ๋๋ค.
useEffect(() => {
const timer = setInterval(() => {
console.log("ํ์ด๋จธ ์คํ๋๋์ค...");
}, 1000)
return () => {
clearInterval(timer);
console.log("๐ฅ ํ์ด๋จธ๊ฐ ์ข
๋ฃ ๋์์ต๋๋ค.");
}
}, []);
return์ Effect_Timer ์ปดํฌ๋ํธ๊ฐ Unmount ๋ ๋ ์คํ๋๋ ์ฝ๋์ด๋ค.
์คํํ๋ฉด โจ
๐ฑ๐ค ๊ฒฐ๋ก
1. ๋ฌด๊ฑฐ์ด ์์ ์ด ์์ ๋ useEffect ์ฌ์ฉ (์ฌ๋ ๋๋ง ๋ฐฉ์ง)
2. Dependency Array๊ฐ ์์ผ๋ฉด ๋ ๋๋ง ๋ง๋ค ์คํ
3. Dependency Array๊ฐ ์์ผ๋ฉด ์ฒซ ๋ ๋๋ง, Array ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ์คํ
4. Dependency Array๊ฐ ๋น๊ฐ์ด๋ฉด ์ฒซ ๋ ๋๋ง ๋๋ง ์คํ
5. useEffect์ return ๊ฐ์ clear ์ฆ Unmount ๋ ๋ ์คํํ ์ฝ๋
'โข React > React Hook' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] useState ์ฌ์ฉ๋ฒ ๋ฐ ์์ - React Hook (0) | 2023.03.30 |
---|