hook์ ํด๋์ค ์ปดํฌ๋ํธ๊ฐ ์๋ ๊ณณ์์ state์ ๋ฆฌ์กํธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ค๋ค.
state์ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ํจ์ํ ์ปดํฌ๋ํธ์์ ์ง์ํด์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ๋ง๋ค์ด์ฃผ๊ณ ๋ฆฌ์กํธ์์ ์ ๊ณตํด์ฃผ๊ณ ์๋ค.
์ปดํฌ๋ํธ ๋ด์์ ๋์ ์ธ ๋ฐ์ดํฐ(state)๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ hook์ด๋ค.
import React, { useState } from 'react';
function Example() {
// "count"๋ผ๋ ์ ์ํ ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
useState
๋ ๋ฐฐ์ด ๋น๊ตฌ์กฐ๋ถํด ํ ๋น์ ํตํด ํ์ฌ state๊ฐ๊ณผ state๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ํจ์๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
useState ํ๋ผ๋ฏธํฐ์ ๋ฃ๋ ๊ฐ์ state์ ์ด๊ธฐ ๊ฐ์ ํด๋น๋๊ณ , ๊ฐ์ ๋ฐ๋๊ธฐ ์ํด setterํจ์๋ฅผ ์ฌ์ฉํ๋ค.
ํด๋์ค ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ state์ ๋ฌ๋ฆฌ ์ด๊ธฐ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋ primitive type ๊ฐ์ ๋ฃ์ด์ค ์ ์๊ณ ์ปดํฌ๋ํธ ๋ด์ ์ฌ๋ฌ๊ฐ๋ฅผ ์ฌ์ฉ ํ ์๋ ์๋ค.
useEffect
๋ react class ๋ฌธ๋ฒ์์ componentDidMount
, componentDidUpdate
, componentWillUnmount
๊ฐ ํฉ์ณ์ง ๊ธฐ๋ฅ์ด๋ค.
๊ณต์ ๋ฌธ์์์๋ ์ปดํฌ๋ํธ๊ฐ ๋๋๋ง ๋ ์ดํ์ ์ด๋ค ์ผ์ ์ํ ํ ์ ์๋๋ก ๋์์ฃผ๋ hook์ด๋ผ๊ณ ํ๋ค.
react๋ effect๊ฐ ์ํ๋๋ ์์ ์ ์ด๋ฏธ DOM์ด ์
๋ฐ์ดํธ๋์์์ ๋ณด์ฅํด์ค๋ค.
function Example() {
const [count, setCount] = useState(0);
// componentDidMount, componentDidUpdate์ ๋น์ทํฉ๋๋ค
useEffect(() => {
// ๋ธ๋ผ์ฐ์ API๋ฅผ ์ด์ฉํด ๋ฌธ์์ ํ์ดํ์ ์
๋ฐ์ดํธํฉ๋๋ค
document.title = `You clicked ${count} times`;
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
useEffect
์ ํจ์๊ฐ ์คํ๋๋ค.cleanup ํจ์
๋ useEffect
์์ ํจ์๋ฅผ ๋ฐํํ๋ ํ์์ผ๋ก ์ฌ์ฉ๋๋ค.cleanup ํจ์
๋ deps๊ฐ ๋น ๋ฐฐ์ด์ผ ๊ฒฝ์ฐ unmount๋ ๋ ์คํ๋๋ค.deps ๋ฐฐ์ด
์ ํน์ ๊ฐ์ ๋ฃ๊ฒ ๋๋ค๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ฒ์ mount ๋ ๋๋ ์คํ๋๊ณ , deps์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๊ธฐ ์ง์ ์๋ ํธ์ถ์ด ๋๊ณ unmount๋ ๋๋ ํธ์ถ๋๋ค.๐ react๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋๋๋ง๋๋ฉด ์์ ์ปดํฌ๋ํธ๋ ๊ฐ์ด ๋ฆฌ๋๋๋ง์ ์คํํ์ง๋ง ์ค์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ ๋ถ๋ถ๋ง DOM์ ์ ์ฉ๋๋ค.
ํ์ง๋ง virtual DOM์๋ ๋ชจ๋ ๋ฆฌ๋๋๋ง์ ๋์ํ๊ณ ์๊ฒ ๋๋ค.๐ react์ ํจ์ ์ปดํฌ๋ํธ๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํจ์ ์ปดํฌ๋ํธ๋ฅผ ์ ์ฒด ๋ค์ ์คํ์ํจ๋ค.
react hook์ ์ฌ์ฉํ๊ฒ ๋๋ฉด hook์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ๋ฅผ react์์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด๋ฌ์ ๋ค์ ํจ์๋ฅผ ์คํ์์ผ๋ ์ด๊ธฐ ๋ฐ์ดํฐ๊ฐ ์๋ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ง์์ผ์ฃผ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๋จผ์ ref
๋ render์์ ์์ฑ๋ DOM ๋
ธ๋๋ ๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ์ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ค.
๊ณต์๋ฌธ์ ref๋ฅผ ์ฌ์ฉํด์ผ ํ ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ํฌ์ปค์ค, ํ ์คํธ ์ ํ์์ญ, ํน์ ๋ฏธ๋์ด์ ์ฌ์์ ๊ด๋ฆฌํ ๋.
- ์ ๋๋ฉ์ด์ ์ ์ง์ ์ ์ผ๋ก ์คํ์ํฌ ๋.
- ์๋ ํํฐ DOM ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ React์ ๊ฐ์ด ์ฌ์ฉํ ๋.
useRef
๋ .current
ํ๋กํผํฐ๋ก ์ ๋ฌ๋ ์ธ์๋ก ์ด๊ธฐํ ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๋ค.
์ฆ .current ํ๋กํผํฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ ๋ด๊ณ ์๋ ์์๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
useRef๋ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ useRef
๋ด์ฉ์ด ๋ณ๊ฒฝ๋๋ฉด ๊ทธ๊ฒ์ ์๋ ค์ฃผ์ง ์๋๋ค.
๋ฆฌ์กํธ์์ DOM ๋
ธ๋๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋ ์ฝ๋ฐฑ ref๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
function TextInputWithFocusButton() {
const inputEl = useRef(null);
const onButtonClick = () => {
// `current` points to the mounted text input element
inputEl.current.focus();
};
return (
<>
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>Focus the input</button>
</>
);
}
useMemo
๋ ์ฑ๋ฅ ์ต์ ํ์ ์ฌ์ฉ๋๋ hook์ด๋ค.
๋ฉ๋ชจ์ด์ ์ด์
์ ํด์ค๋ค๋ ๋ป์ผ๋ก useMemo๋ก ์ฌ์ฉ๋๋๋ฐ, ํน์ ๊ฒฐ๊ณผ ๊ฐ์ ์ฌ์ฌ์ฉ ํด์ค๋ค.
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
ํจ์ ์ปดํฌ๋ํธ๊ฐ ๊ณ์ ํธ์ถ๋์ด๋ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ํด๋น ์ปดํฌ๋ํธ์ ์ง์ญํจ์๋ฅผ ํธ์ถํ๊ณ ์ถ์๋ ์ฌ์ฉํ๋ค.
useCallback
๋ ํด๋น ์ปดํฌ๋ํธ์ state๋ props๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์บ์์ ์ ์ฅ๋ ์บก์ณ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ํจ์๋ฅผ ์คํ์ํจ๋ค.
const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);
useReducer
๋ ์ํ๋ฅผ ๊ด๋ฆฌํ ๋ ์ฌ์ฉ๊ฐ๋ฅํ hook ํจ์์ด๊ณ , ์ธ๋ถ ์ปดํฌ๋ํธ์์ ์์ฑํด ์ฌ์ฉํ ์ ์๋ค๋ ์ ์ด useState์ ๋ค๋ฅธ์ ์ด๋ค.
const initialState = {count: 0};
function reducer(state, action) {
switch (action.type) {
case 'increment':
return {count: state.count + 1};
case 'decrement':
return {count: state.count - 1};
default:
throw new Error();
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<>
Count: {state.count}
<button onClick={() => dispatch({type: 'decrement'})}>-</button>
<button onClick={() => dispatch({type: 'increment'})}>+</button>
</>
);
}
๐ state ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ์๋ก์ด state ๊ฐ์ผ๋ก ๋์ฒด(replace)๋๋ ๊ฒ์ด์ง ๊ธฐ์กด state ๊ฐ์ ๋ณ๊ฒฝ(modify)ํ๊ฑฐ๋ ๋ฎ์ด์ฐ์ง(overwrite) ์๋๋ค. (๋ฐ์ดํฐ ๋ถ๋ณ์ฑ ์ ์ง)