๐ช React Hook ๊ฐ๋ ์ ๋ฆฌ
๐ช React Hook ๊ฐ๋
์ ๋ฆฌ
1. Hook์ด๋?
Hook(ํ
)์ React์ ํจ์ํ ์ปดํฌ๋ํธ(function component)์์
๊ธฐ์กด ํด๋์ค ์ปดํฌ๋ํธ์์๋ง ๊ฐ๋ฅํ๋ ๊ธฐ๋ฅ(์ํ ๊ด๋ฆฌ, ์๋ช
์ฃผ๊ธฐ ๊ด๋ฆฌ ๋ฑ)์
์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ํน๋ณํ ํจ์์ด๋ค.
React 16.8 ๋ฒ์ ๋ถํฐ ๋์
๋์์ผ๋ฉฐ,
์ปดํฌ๋ํธ๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด ์ค๋ค.
2. ์ Hook์ด ์๊ฒผ์๊น?
๊ธฐ์กด ๋ฌธ์ ์
- ํด๋์ค ์ปดํฌ๋ํธ๋ ๋ฌธ๋ฒ์ด ๋ณต์กํ๊ณ
this๋ฐ์ธ๋ฉ์ด ํ์ํ๋ค. - ์ฌ๋ฌ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋(
componentDidMount,componentDidUpdate,componentWillUnmount)์์
ํ๋์ ๋ก์ง์ ๋๋ ์์ฑํด์ผ ํด์ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์ ๋ค. - ์ํ ๊ด๋ จ ๋ก์ง์ ์ฌ๋ฌ ์ปดํฌ๋ํธ ๊ฐ์ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ ๋ค.
Hook์ ๋ฑ์ฅ์ผ๋ก ํด๊ฒฐ๋ ์
- ํจ์ํ ์ปดํฌ๋ํธ์์๋ ์ํ(state)์ ์๋ช ์ฃผ๊ธฐ ๋ก์ง์ ์ฌ์ฉํ ์ ์๋ค.
- ์ปค์คํ ํ (Custom Hook)์ ํตํด ๋ก์ง์ ์ฌ์ฌ์ฉํ ์ ์๋ค.
- ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ํ ์คํธ๊ฐ ์ฌ์์ก๋ค.
3. ๊ธฐ๋ณธ ๊ท์น (Rules of Hooks)
๋ฐ๋์ ํจ์ ์ปดํฌ๋ํธ์ ์ต์์์์๋ง ํธ์ถํด์ผ ํ๋ค.
โ ๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค์ฒฉ ํจ์ ์์์๋ ์ฌ์ฉ ๋ถ๊ฐ.React ํจ์(์ปดํฌ๋ํธ or ์ปค์คํ ํ ) ์์์๋ง ํธ์ถํด์ผ ํ๋ค.
โ ์ผ๋ฐ JavaScript ํจ์์์๋ ํธ์ถ ๋ถ๊ฐ.
4. ์ฃผ์ ๋ด์ฅ Hook
| Hook ์ด๋ฆ | ์ค๋ช |
|---|---|
useState | ์ปดํฌ๋ํธ ๋ด ์ํ(state)๋ฅผ ์ ์ธํ๊ณ ๊ด๋ฆฌ |
useEffect | ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ (๋ ๋๋ง ์ดํ, ๋ณ๊ฒฝ ๊ฐ์ง, ์ ๋ฆฌ ์์ ๋ฑ) |
useContext | Context API๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ญ ๋ฐ์ดํฐ ์ ๊ทผ |
useRef | DOM ์ ๊ทผ ๋๋ ๋ ๋ ์ฌ์ด์์ ์ ์ง๋๋ ๊ฐ ๊ด๋ฆฌ |
useMemo | ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ ์ฑ๋ฅ ์ต์ ํ |
useCallback | ํจ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ ๋ถํ์ํ ์ฌ๋ ๋๋ง ๋ฐฉ์ง |
useReducer | ๋ณต์กํ ์ํ ๋ก์ง์ ๋ฆฌ๋์ ํจํด์ผ๋ก ๊ด๋ฆฌ |
useLayoutEffect | DOM์ด ๋ณ๊ฒฝ๋ ์งํ ๋๊ธฐ์ ์ผ๋ก ์คํ |
useImperativeHandle | ref๋ฅผ ํตํด ๋ถ๋ชจ๊ฐ ์ ๊ทผํ ์ ์๋ ๊ฐ ์ ์ด |
5. ์์
โ useState & useEffect ์์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import React, { useState, useEffect } from "react";
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log(`ํ์ฌ ์นด์ดํธ: ${count}`);
}, [count]); // count ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง ์คํ๋จ
return (
<button onClick={() => setCount(count + 1)}>
ํด๋ฆญ ํ์: {count}
</button>
);
}
export default Counter;
6. ์ปค์คํ ํ (Custom Hook)
Hook์ ์กฐํฉํด์ ์๋ก์ด ํ ์ ๋ง๋ค ์ ์๋ค. ์ด๋ก์จ ์ํ ๋ก์ง์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ ๋ค.
์์: ์๋์ฐ ํฌ๊ธฐ ๊ฐ์ง ํ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import { useState, useEffect } from "react";
function useWindowSize() {
const [size, setSize] = useState({
width: window.innerWidth,
height: window.innerHeight,
});
useEffect(() => {
const handleResize = () => setSize({
width: window.innerWidth,
height: window.innerHeight
});
window.addEventListener("resize", handleResize);
return () => window.removeEventListener("resize", handleResize);
}, []);
return size;
}
export default useWindowSize;
7. Hook์ ์ฅ์ ์์ฝ
- โ ์ฝ๋ ๊ฐ๊ฒฐ์ฑ โ ํด๋์ค ๋ฌธ๋ฒ๋ณด๋ค ๋จ์
- ๐ ๋ก์ง ์ฌ์ฌ์ฉ โ ์ปค์คํ ํ ์ผ๋ก ์ถ์ํ ๊ฐ๋ฅ
- โก ์ฑ๋ฅ ์ต์ ํ โ
useMemo,useCallback๋ฑ์ผ๋ก ๋ถํ์ํ ์ฐ์ฐ ๊ฐ์ - ๐งฉ ์ปดํฌ๋ํธ ๊ตฌ์กฐ ๋จ์ํ โ ๊ธฐ๋ฅ ์ค์ฌ์ผ๋ก ๋ถ๋ฆฌ ๊ฐ๋ฅ
8. ์ฐธ๊ณ ์๋ฃ
```
This post is licensed under CC BY 4.0 by the author.