kohigowild
React useState(), useEffect() ๋ณธ๋ฌธ
๐ฉ useState()
- ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์์ ๋์ ์ธ ๊ฐ์ ์ํ(state)๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ฌ์ฉ์ ์ธํฐ๋์ ์ ํตํด ์ปดํฌ๋ํธ์ ์ํ๊ฐ์ด ๋์ ์ผ๋ก ๋ฐ๋ ๊ฒฝ์ฐ์๋ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ํ์ํ๋ค.
- Hooks ๊ธฐ๋ฅ์ด ๋์ ๋ ๋ฆฌ์กํธ 16.8 ๋ฒ์ ๋ถํฐ useState() ํจ์๋ฅผ ํตํด ํจ์ํ ์ปดํฌ๋ํธ์์๋ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
๐ฉ useState() ์ฌ์ฉ ํ๋ฆ
useState()๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ค์์ ์ธ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋ค.
import { useState } from "react"; // โ
function App() {
const [count, setCount] = useState(0); // โ
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}></button> // โ
</div>
);
}
โ useState()๋ฅผ React์์ import
โ useState()๋ก state ๋ณ์๋ฅผ ๋ง๋ค์ด ์ค๋ค. ์ฌ๊ธฐ์ ๋๊ดํธ๊ฐ ์๋ฏธํ๋ ๊ฒ์ '๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด' ๋ผ๋ JavaScript ๋ฌธ๋ฒ์ด๋ค.
โ useState()๊ฐ ๋ง๋ค์ด ์ค state๋ฅผ ๊ฐฑ์ ํ ์ ์๋ ํจ์๋ก state ๋ณ์๋ฅผ ๊ฐฑ์ ํ๋ค. React๋ ๋ณํ๋ฅผ ์ธ์งํ๊ณ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋ง ํ๋ค.
๐ฉ useState() ์ธ๋ถ ์ฌํญ
const [showing, setShowing] = useState(false);
- useState์ ์ธ์๋ก ๋๊ฒจ์ค false๋ showing์ state ์ด๊ธฐ๊ฐ์ด๊ณ , useState๋ false๋ฅผ ์ด๊ธฐ๊ฐ์ผ๋ก ๊ฐ์ง๋ showing state์ showing์ ๊ฐ์ ๊ฐฑ์ ํ๋ setShowing ํจ์๋ฅผ ๋ฐํํ๋ค.
const onClick = () => {
setShowing((prev) => !prev);
};
- ํด๋ฆญ ์ state ๊ฐ ๋ณ๊ฒฝ
return (
<div>
<button onClick={onClick}>{showing ? "Hide" : "Show"}</button>
</div>
);
- state ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
- state๊ฐ false(์ด๊ธฐ๊ฐ)์ธ ๊ฒฝ์ฐ ๋ฒํผ ๋ด ํ ์คํธ๋ก Show ์ถ๋ ฅ, true์ธ ๊ฒฝ์ฐ Hide ์ถ๋ ฅ
๐ฉ useEffect()
- useEffect()๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ํน์ ์์
์ ์คํํ ์ ์๋๋ก ํ๋ Hook์ด๋ค. useEffect()๋ ์ปดํฌ๋ํธ๊ฐ mount ๋์ ๋, unmount ๋์ ๋, update ๋์ ๋ ํน์ ์์
์ ์ฒ๋ฆฌํ ์ ์๋ค.
- ๋ง์ดํธ(mount): ๋ง์ดํธ๋ ์ปดํฌ๋ํธ๊ฐ ์ต์ด๋ก ๋ ๋ ๋ ๋ ๊ฑฐ์น๋ ๊ณผ์ ์ด๋ค. ์ดํ props์ state๊ฐ ๋ณ๊ฒฝ๋ ๋๋ ๋ง์ดํธ ๊ณผ์ ์ ๊ฑฐ์น์ง ์๋๋ค.
- ์ธ๋ง์ดํธ(unmount): ์ธ๋ง์ดํธ๋ ์ปดํฌ๋ํธ๊ฐ ์ญ์ ๋ ๋ ๊ฑฐ์น๋ ๊ณผ์ ์ด๋ค.
useEffect() ์ฌ์ฉ ์์
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
setTimeout(() => {
console.log(`You clicked ${count} times`);
}, 3000);
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
ํด๋์ค ์ปดํฌ๋ํธ
componentDidUpdate() {
setTimeout(() => {
console.log(`You clicked ${this.state.count} times`);
}, 3000);
}
๐ฉ useEffect() ์ธ๋ถ ์ฌํญ
์ปดํฌ๋ํธ์ ๋๋๋ง ์์ ์๋ ๋ชจ๋ ํจ์๋ (์ด๋ฒคํธ ํธ๋ค๋ฌ, ์ดํํธ, ํ์์์์ด๋ ๊ทธ ์์์ ํธ์ถ๋๋ API ๋ฑ) ๋๋(render)๊ฐ ํธ์ถ๋ ๋ ์ ์๋ props์ state ๊ฐ์ ์ก์๋๋ค.
useEffect(callback[, dependencies]);
- useEffect()๋ 2๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋๋ค.
- callback => ์คํํ ํจ์, dependencyArray => dependency array๋ฅผ ํตํด useEffect()๋ ์กฐ๊ฑด๋ถ๋ก callback ํจ์๋ฅผ ์คํํ ์ ์๋ค. (dependency array ๋ณ๊ฒฝ ์) ๋๊ฒจ์ฃผ์ง ์์ผ๋ฉด ๋งค๋ฒ ๋ ๋๋ง ์ดํ์ callback ํจ์๊ฐ ์คํ๋๋ค.
useEffect(() => {
document.title = `Greetings to ${name}`;
}, [name]);
- ๊ตฌ์ฑ ์์๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค title์ด ์ ๋ฐ์ดํธ ๋๋ ๊ฒ์ด ์๋๋ผ, [name] ์์ฑ์ด ๋ณ๊ฒฝ๋ ๋ callback์ด ์คํ๋๋ค.
useEffect(() => {
document.title = `Greetings to ${name}`;
});
- dependency array๋ฅผ ๋๊ธฐ์ง ์์์ผ๋ฏ๋ก ๋งค ๋ ๋ ์๋ง๋ค ์คํ
useEffect(() => {
document.title = `Greetings to ${name}`;
}, []);
- useEffect์ ๋น ๋ฐฐ์ด์ ๋ฃ๋ ๊ฒฝ์ฐ๋ ์ฒ์์ผ๋ก ๋ณ์๊ฐ ์์ฑ๋ ๋, ์ฆ ์ปดํฌ๋ํธ๊ฐ ์ต์ด๋ก ๋ ๋๋ง ๋๋ ๋ง์ดํธ (mount)์์ ๋จ ํ๋ฒ ์คํ๋ ๋๋ฅผ ์ํด ์ฌ์ฉํ๋ค.
useEffect(() => {
console.log("hi :)");
return () => console.log("bye :(");
}, []);
- ์ธ๋ง์ดํธ๋ ๋น ๋ฐฐ์ด๊ณผ ํด๋ฆฐ์ ํจ์๋ฅผ ์กฐํฉํ์ฌ ๊ตฌํํ๋ค. ์ด๋ ๊ฒ ๊ตฌํํ๋ ๊ฒฝ์ฐ, ์ปดํฌ๋ํธ๊ฐ ์๊ธธ ๋๋ ์ฝ์ ์ฐฝ์ hi :) ์ปดํฌ๋ํธ๊ฐ ์์ด์ง๋ ์๊ฐ์๋ ์ฝ์ ์ฐฝ์ bye :( ๊ฐ ์ถ๋ ฅ๋๋ค.
๐ฉ Reference
https://dmitripavlutin.com/react-useeffect-explanation/
https://nomadcoders.co/react-for-beginners/lobby
https://iforint.tistory.com/157
https://jongminfire.dev/react-use-effect-ํ -์ดํํธ-ํจ์-ํด๋ฆฐ์ -ํจ์
https://overreacted.io/ko/a-complete-guide-to-useeffect/
https://sgwanlee.medium.com/useeffect์-dependency-array-ebd15f35403a
https://xiubindev.tistory.com/97
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] props์ state (0) | 2022.12.15 |
---|---|
REACT ์ปดํฌ๋ํธ ์๋ช ์ฃผ๊ธฐ (Life Cycle) (0) | 2022.12.10 |
React :: COIN TRACKER (0) | 2022.11.29 |
React๋ก ๊ฐ๋จํ To-Do-List ๊ตฌํ (0) | 2022.11.24 |
React JSX ๋ฌธ๋ฒ๊ณผ ์์ ์ ๋ฆฌ (0) | 2022.11.09 |