ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ฏ useEffect๋ ๋ฌด์์ผ๊น?
useEffect๋ **"๋ถ์ ํจ๊ณผ(Effect)"**๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋๊ตฌ์์.
๋ถ์ ํจ๊ณผ๋?
์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ํจ๊ป ์คํ๋์ด์ผ ํ๋ ์ถ๊ฐ ์์
์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ผ์.
์๋ฅผ ๋ค์ด, ์ด๋ฐ ์์ ๋ค์ด ์์ด์:
- ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ (API ํธ์ถ)
- ๋ธ๋ผ์ฐ์ ์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ (์: ํ์ดํ ๋ณ๊ฒฝ)
- ํ์ด๋จธ๋ ๊ตฌ๋ ์ค์ ํ๊ธฐ
์ด๋ฐ ์์
๋ค์ ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋ํ๋๊ฑฐ๋ ์
๋ฐ์ดํธ๋ ๋ ์๋์ผ๋ก ์คํ๋๊ฒ ํด์ผ๊ฒ ์ฃ ?
๋ฐ๋ก ๊ทธ๋ useEffect๊ฐ ํ์ํด์!
๐ ์ง์์ผ ์ด์ผ๊ธฐ๋ก ์ดํดํ๊ธฐ
์ง์ ์๋์ด ์ค๋ฉด ์ง์ ์ฒญ์ํด์ผ ํ์์์? ๐งน
- ์ง(์ปดํฌ๋ํธ)์ด ํ๋ฉด์ ๋ํ๋๊ฑฐ๋ ๋ฐ๋ ๋
- **"์ฒญ์ํ๊ธฐ(๋ถ์ ํจ๊ณผ)"**๋ผ๋ ์ผ์ ์คํํด์ผ ํ์ฃ .
useEffect๋ ์ด๋ฐ "์ง์์ผ" ๊ฐ์ ์ถ๊ฐ ์์ ์ ๋งก์์ฃผ๋ ์น๊ตฌ์์.
๐ ๏ธ useEffect ๊ธฐ๋ณธ ์์
์, ์ด์ ์ค์ ์ฝ๋๋ก ๋ณด์ฌ๋๋ฆด๊ฒ์!
ํ๋ฉด์ ์ปดํฌ๋ํธ๊ฐ ๋ํ๋ ๋ "Hello World"๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ๋ธ๋ผ์ฐ์ ํ์ดํ์ ํ์ํด ๋ณด๊ฒ ์ต๋๋ค.
import React, { useEffect } from "react";
function Welcome() {
useEffect(() => {
// ์ด ์์ ๋ถ์ ํจ๊ณผ๋ฅผ ์ ์ด์
document.title = "Hello World!"; // ๋ธ๋ผ์ฐ์ ํญ ์ ๋ชฉ์ ๋ณ๊ฒฝํด์
});
return <h1>์๋
ํ์ธ์! ๐</h1>;
}
export default Welcome;
๐ ์ฝ๋์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ๊น?
- useEffect(() => { ... })
- useEffect๋ ํจ์ ์์ ๋ถ์ ํจ๊ณผ(์ด ๊ฒฝ์ฐ ํ์ดํ ๋ณ๊ฒฝ)๋ฅผ ์คํํด์.
- ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋ํ๋๋ฉด ์๋์ผ๋ก ์คํ๋ฉ๋๋ค.
- document.title = "Hello World!"
- ๋ธ๋ผ์ฐ์ ์ ํญ ์ ๋ชฉ์ ๋ฐ๊ฟ์ฃผ๋ ์ฝ๋์์.
- ๊ฒฐ๊ณผ
- ํ๋ฉด์ <h1>์ด ํ์๋๊ณ ,
- ๋ธ๋ผ์ฐ์ ํญ ์ ๋ชฉ์ด "Hello World!"๋ก ๋ฐ๋๋๋ค.
โฐ useEffect์์ ์คํ ์์ ์ ์ดํ๊ธฐ
"๋ถ์ ํจ๊ณผ๋ฅผ ์ธ์ ์คํํ ์ง"๋ ์ ์ดํ ์ ์์ด์.
useEffect์๋ ์์กด์ฑ ๋ฐฐ์ด์ด๋ผ๋ ๊ฒ ์๊ฑฐ๋ ์.
1. ์ปดํฌ๋ํธ๊ฐ ๋ํ๋ ๋๋ง ์คํ
useEffect(() => {
console.log("์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋ํ๋ฌ์ด์!");
}, []); // ์์กด์ฑ ๋ฐฐ์ด์ด ๋น ๋ฐฐ์ด์ด๋ฉด, ํ ๋ฒ๋ง ์คํ๋ผ์
- ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ์ฒ์ ๋ํ๋ ๋๋ง ์คํ๋ผ์.
- ์ด๋ [] ์์ ์๋ฌด๊ฒ๋ ์์ผ๋ฉด ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
2. ํน์ ๊ฐ์ด ๋ฐ๋ ๋ ์คํ
import React, { useState, useEffect } from "react";
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log(`ํ์ฌ ์นด์ดํธ: ${count}`);
}, [count]); // count ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ์คํ๋ผ์
return (
<div>
<p>์นด์ดํธ: {count}</p>
<button onClick={() => setCount(count + 1)}>+1</button>
</div>
);
}
export default Counter;
์ค๋ช :
- count ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค useEffect ์์ ์ฝ๋๊ฐ ์คํ๋ผ์.
- ๋ฒํผ์ ํด๋ฆญํด์ count๋ฅผ ์ฆ๊ฐ์ํค๋ฉด ์ฝ์์ "ํ์ฌ ์นด์ดํธ"๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
3. ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง ๋ ์ ๋ฆฌ ์์ ํ๊ธฐ
์๋ฅผ ๋ค์ด, ํ์ด๋จธ๋ ๊ตฌ๋ ์ค์ ์ ํด๋์๋ค๋ฉด, ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง ๋ **์ ๋ฆฌ(clean-up)**๋ฅผ ํด์ค์ผ ํด์.
import React, { useEffect } from "react";
function Timer() {
useEffect(() => {
const timer = setInterval(() => {
console.log("ํ์ด๋จธ ์คํ ์ค...");
}, 1000);
// ์ ๋ฆฌ(clean-up) ํจ์
return () => {
clearInterval(timer); // ํ์ด๋จธ๋ฅผ ์ ๋ฆฌํด์
console.log("ํ์ด๋จธ๊ฐ ์ ๋ฆฌ๋์์ด์!");
};
}, []);
return <p>โฐ ํ์ด๋จธ ์คํ ์ค...</p>;
}
export default Timer;
์ค๋ช :
- setInterval๋ก ํ์ด๋จธ๋ฅผ ์ค์ ํ์ง๋ง,
- ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง ๋ clearInterval์ ์ฌ์ฉํด์ ํ์ด๋จธ๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
๐ ์ ๋ฆฌํ์๋ฉด!
- useEffect๋ ๋ถ์ ํจ๊ณผ(์ถ๊ฐ ์์ )๋ฅผ ์คํํ๋ ๋๊ตฌ์์.
- ์คํ ์์ ์ ์ ์ดํ ์ ์์ด์:
- ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ํ๋ ๋๋ง ์คํ: useEffect(..., [])
- ํน์ ๊ฐ์ด ๋ฐ๋ ๋ ์คํ: useEffect(..., [๊ฐ])
- ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง ๋ ์ ๋ฆฌ ์์ : return ์์ ์ ๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํด์.
'web > react hook' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
useImperativeHandle (0) | 2024.12.14 |
---|---|
useId (0) | 2024.12.14 |
useDeferredValue (0) | 2024.12.14 |
useDebugValue (0) | 2024.12.14 |
useContext (0) | 2024.12.14 |
- Total
- Today
- Yesterday
- experimental_taintobjectreference
- react dom
- Nextjs
- preconnect
- Props
- ์ํ๊ด๋ฆฌ
- ์ ์ฅ์
- state
- prefetchdns
- react hook
- experimental_taintuniquevalue
- Store
- ์ต์ ๋ฐ์ดํฐ
- ๋ฒ ํ
- react
- finddomnode
- dns-prefetch
- experimental
- component
- useid
- ๋ฐ์ดํฐ์ ์ง
- useinsertioneffect
- zustand
- ์คํ์
- useformstatus
- react dom hook
- useRef
- ์ธ๋ถํฐํธ
- flushsync
- usedeferredvalue
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |