1. Hook
Hook์ ์ปดํฌ๋ํธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌ(State)ํ๊ณ , ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ํธ์์ฉ(Effect)์ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ์์ ํ์ตํ useState๊ฐ ๋ฐ๋ก State Hook์ด๋ค. Hook์ ํด๋์ค ์ปดํฌ๋ํธ(Class Component)๋ฅผ ๋ณด์ํ๊ณ , ํจ์ ์ปดํฌ๋ํธ์์ ํด๋์ค ์ปดํฌ๋ํธ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด React 16.8 ๋ฒ์ ์์ ์ถ๊ฐ๋์๋ค.
โจ Hook ์ ์์ฌํญ
1) Hook์ Reactํจ์(์ปดํฌ๋ํธ, Hook) ๋ด์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
2) Hook์ ์ด๋ฆ์ ๋ฐ๋์ 'use'๋ก ์์ํด์ผ ํ๋ค.
3) ์ต์์ Level์์๋ง Hook์ ํธ์ถํ ์ ์๋ค. ์ฆ, ์ปดํฌ๋ํธ ๋ด์์ Hook์ ์ฌ์ฉํ ๋ ๋ฐ๋์ ์ฒซ๋ฒ์งธ ์ค๊ดํธ({ }) ์์์๋ง ์ฌ์ฉํด์ผ ํ๋ค. (๐ if๋ฌธ, for๋ฌธ ์์ชฝ ๋๋ ์ฝ๋ฐฑํจ์ ๋ด์์ ํธ์ถํ๋ฉด ์๋๋ค.)
2. State Hook๊ณผ Effect Hook
2-1. State Hook
const App = () => {
// ์ผ๋ฐ์ ์ธ useState ์ฌ์ฉ๋ฒ
const [state์ด๋ฆ, setState์ด๋ฆ] = useState(์ด๊ธฐ๊ฐ)
}
- useState๋ ์ปดํฌ๋ํธ ๋ด ๋์ ์ธ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ hook์ด๋ค.
- ์ต์ด์ useState๊ฐ ํธ์ถ๋ ๋ ์ด๊ธฐ๊ฐ์ผ๋ก ์ค์ ๋๋ฉฐ, ์ดํ ์ฌ ๋ ๋๋ง์ด ๋ ๊ฒฝ์ฐ ์ด ๊ฐ์ ๋ฌด์๋๋ค.
- state๋ ์ฝ๊ธฐ ์ ์ฉ์ด๋ฏ๋ก ์ง์ ์์ ํ๋ฉด ์๋๋ค.
- state๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ setState๋ฅผ ์ด์ฉํ๋ค.
- state๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋์ผ๋ก ์ปดํฌ๋ํธ๊ฐ ์ฌ ๋ ๋๋ง๋๋ค.
const App = () => {
const [title, setTitle] = useState("");
setTitle("Hello"); // State๋ฅผ ๋ณ๊ฒฝํ ๊ฐ์ ์ง์ ์
๋ ฅ
setTitle((current) => { // ๋๋ ํ์ฌ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ํจ์ ์ ์ธ
return current + "World"; // return ๊ฐ์ด state์ ๋ฐ์๋๋ค.
});
}
- state๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ setState ํจ์์ ์ง์ ๊ฐ์ ์ ๋ ฅํ๊ฑฐ๋,
- ํ์ฌ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ํจ์๋ฅผ ์ ๋ฌํ๋ค. ์ด ๋ ํจ์์์ return๋๋ ๊ฐ์ด state์ ๋ฐ์๋๋ค.
2-2. Effect Hook
const App = () => {
useEffect(EffectCallback, [Deps])
}
- Effect Hook์ ์ฌ์ฉํ๋ฉด ํจ์ ์ปดํฌ๋ํธ์์ side effect๋ฅผ ์ํํ ์ ์๋ค.
- ์ฆ, ์ด๋ ํ ๊ฐ์ด ๋ณํ ๋ ๋ง๋ค ๋ด๊ฐ ์ค์ ํ ํจ์๊ฐ ์คํ๋๋ค.
- ์ปดํฌ๋ํธ๊ฐ ์ต์ด๋ก ๋ ๋๋ง๋ ๋, ์ง์ ํ State๋ Props๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค EffectCallbackํจ์๊ฐ ํธ์ถ๋๋ค.
- Deps: ๋ณ๊ฒฝ์ ๊ฐ์งํ ๋ณ์๋ค์ ์งํฉ(๋ฐฐ์ด)
- EffectCallback: Deps์ ์ง์ ๋ ๋ฒผ์๊ฐ ๋ณ๊ฒฝ๋ ๋ ์คํํ ํจ์
const App = () => {
const [count, setCount] = useState(0);
useEffect(() => {
console.log(`๋ฒํผ์ ${count}ํ ํด๋ฆญํ์ต๋๋ค.`);
}, [count]); // count์ state๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ง๋ค ์ฒซ ๋ฒ์งธ ์ธ์์ ํจ์ ์คํ
return (
<div>
<button onClick={() => setCount(count+1)}>
ํด๋ฆญํ์ธ์
</button>
</div>
);
}
- Effect Hook์ ์ฌ์ฉํ๋ฉด ํจ์ ์ปดํฌ๋ํธ์์ side effect๋ฅผ ์ํํ ์ ์๋ค.
- ์ปดํฌ๋ํธ๊ฐ ์ต์ด๋ก ๋ ๋๋ง๋ ๋, ์ง์ ํ State๋ Prop๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ดํํธ ์ฝ๋ฐฑ ํจ์๊ฐ ํธ์ถ๋๋ค.
const App = () => {
useEffect(() => {
// State๊ฐ ๋ณ๊ฒฝ๋ ๋, ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ๋
const intervalId = setInterval(() => {
console.log('Hi');
}, 1000);
// ์ปดํฌ๋ํธ๋ฅผ ์ฌ ๋ ๋๋ง ํ๊ธฐ ์ ์, ์ปดํฌ๋ํธ๊ฐ ์์ด์ง ๋
return () => {
clearInterval(intervalId);
}
}, []); // ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋ ๋ ์ต์ด๋ก ํ๋ฒ๋ง ์คํ๋๋ค.
}
- useEffect์ ์ดํํธ ํจ์ ๋ด์์ ๋ค๋ฅธ ํจ์๋ฅผ returnํ ๊ฒฝ์ฐ state๊ฐ ๋ณ๊ฒฝ๋์ด ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋๊ธฐ ์ ๊ณผ ์ปดํฌ๋ํธ๊ฐ ์์ด์ง ๋(Destroy) ํธ์ถํ ํจ์๋ฅผ ์ง์ ํ๊ฒ ๋๋ค.
3. ์ด์ธ์ Hooks
3-1. useMemo
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b])
- ์ง์ ํ State๋ Props๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ ํ์ฉํด ๊ณ์ฐ๋ ๊ฐ์ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ ์ฌ๋ ๋๋ง ์ ๋ถํผ์ํ ์ฐ์ฐ์ ์ค์ธ๋ค.
- useMemon์ ์ฐ์ฐ์ ๋ ๋๋ง ๋จ๊ณ์์ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ๋ก์ง์ ์์ฑํ์ง ์๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค.
const App = () => {
const [firstName, setFirstName] = useState('์ฒ ์')
const [lastName, setLastName] = useState('๊น')
// ์ด๋ฆ๊ณผ ์ฑ์ด ๋ฐ๋ ๋๋ง๋ค ํ๋ค์์ ๋ฉ๋ชจํด๋๋ค.
const fullName = useMemo(() => {
return `${firstName} ${lastName}` // ๋ฆฌํด๋๋ ๊ฐ์ด fullName์ ๋ค์ด๊ฐ๋ค.
}, [firstName, lastName])
}
3-2. useCallback
const memoizedCallback = useCallback (
() => {
doSomething(a, b);
},
[a, b]
);
- ํจ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ Hook์ด๋ค. ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ ๋๋ง๋ ๋ ๋ถํ์ํ๊ฒ ํจ์๊ฐ ๋ค์ ์์ฑ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
- useMemo๊ฐ ๋ณ์๋ฅผ ๋ฉ๋ชจํ๊ธฐ ์ํด ์กด์ฌํ๋ Hook์ด๋ผ๋ฉด, useCallback์ ํจ์๋ฅผ ๋ฉ๋ชจํ๊ธฐ ์ํด ์กด์ฌํ๋ Hook์ด๋ค.
- useMemo(() => fn, deps) ์ useCallback(fn, deps) ๋ ๊ฐ๋ค.
const App = () => {
const [firstName, setFirstName] = useState('์ฒ ์')
const [lastName, setLastName] = useState('๊น')
// ์ด๋ฆ๊ณผ ์ฑ์ด ๋ฐ๋ ๋๋ง๋ค ํ๋ค์์ ๋ฆฌํดํ๋ ํจ์๋ฅผ ๋ฉ๋ชจ
const getFullName = useCallback(() => {
return `${firstName} ${lastName}`
}, [firstName, lastName]) // ํจ์๊ฐ ๋ฐํ๋๋ค.
return <>{getFullName()}</> // ํจ์์ ํํ๋ก ์ฌ์ฉ
}
3-3. useRef
const refContainer = useRef(initialValue);
- ์ปดํฌ๋ํธ ์์ ์ฃผ๊ธฐ(์๋ช ์ฃผ๊ธฐ) ๋ด์์ ์ ์งํ ref ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
- ref ๊ฐ์ฒด๋ .current ๋ผ๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ด ๊ฐ์ ์์ ๋กญ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
- ์ผ๋ฐ์ ์ผ๋ก React์์ DOM Element์ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ค. (DOM Element์ ref ์์ฑ์ ์ด์ฉ)
- useRef์ ์ํด ๋ฐํ๋ ref ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ ๋๋ง๋์ง ์๋๋ค.
const App = () => {
const inputRef = useRef(null)
const onButtonClick = () => {
inputRef.current.focus()
}
return (
<div>
<input ref={inputRef} type="text" />
<button onClick={onButtonClick}>input์ผ๋ก ํฌ์ปค์ค</button>
</div>
)
}
4. Custom Hook
์์ ๋ง์ Hook์ ๋ง๋ค๋ฉด ์ปดํฌ๋ํธ ๋ก์ง์ ํจ์๋ก ๋ฝ์๋ด์ด ์ฌ์ฌ์ฉํ ์ ์๋ค. UI ์์์ ์ฌ์ฌ์ฉ์ฑ์ ์ฌ๋ฆฌ๊ธฐ ์ํด ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๊ฒ์ฒ๋ผ, ๋ก์ง์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ธฐ ์ํด์๋ Custom Hook์ ์ ์ํ๋ค.
function useMyHook(args) {
const [status, setStatus] = useState(null);
// ...
return status;
}
- ํ ๋ก์ง์ด ์ฌ๋ฌ ๋ฒ ์ฌ์ฉ๋ ๊ฒฝ์ฐ ํจ์๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ ์ฒ๋ผ Hook์ ๋ง๋๋ ๊ฒ์ผ ๋ฟ, ์๋ก์ด ๊ฐ๋ ์ ์๋๋ค.
- Hook์ ์ด๋ฆ์ 'use'๋ก ์์ํด์ผํ๋ค.
- ํ Hook ๋ด์ state๋ ๊ณต์ ๋์ง ์๋๋ค.
'elice > WIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[week_09] React ๋ฌธ๋ฒ | React-Router-Dom v6, useReducer, useContext (2) | 2022.03.13 |
---|---|
[week_09] React ์ํ ๊ด๋ฆฌ (0) | 2022.03.11 |
[week_08] React ๊ธฐ์ด โ ก (1) ์ด๋ฒคํธ (0) | 2022.03.02 |
[week_08] React ๊ธฐ์ด โ (4) React ํ๋ก์ ํธ ์์ฑ (0) | 2022.02.28 |
[week_08] React ๊ธฐ์ด โ (3) Props์ State (0) | 2022.02.28 |