
๐งพ ์ฐธ๊ณ ๋ฌธ์ :
https://ko.react.dev/reference/react/hooks
- ๊ฐ Hook์ ๋ํ ์์ธํ ์ค๋ช ์ ๋ค์ ํฌ์คํธ์์
React Hooks๋ ๋ฆฌ์กํธ 16.8 ๋ฒ์ ์ ์๋ก ๋์
๋ ๊ธฐ๋ฅ์ผ๋ก,
Class๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ React์ ๊ธฐ๋ฅ๋ค์ ํธํ๊ฒ ์ฌ์ฉํ ์ ์์
state ๋ณ์๋ฅผ ์ถ๊ฐํ ์ ์๋ React Hookconst [์ํ, set์ํ] = useState(์ด๊ธฐ๊ฐ);
set์ํ(๋ณ๊ฒฝํ ๊ฐ);
<div>{์ํ}</div>
useState์ ๊ฐ์ด ์ํ ๊ด๋ฆฌํ ์ ์๋ Hookreducer ํจ์์ ๋ด๋ถ ์
๋ฐ์ดํธ ๋ก์ง์ ์ฌ์ฉํ์ฌ state ๋ณ์๋ฅผ ์ถ๊ฐํจconst [์ํ, dispatchํจ์] = useReducer(reducerํจ์, ์ด๊ธฐ์ํ);
// dispatchํจ์ : ์ํ(state) ๋ณ๊ฒฝ ์ ํ์ํ ์ ๋ณด๋ฅผ ์ ๋ฌํด์ฃผ๋ ํจ์
// reducerํจ์ : dispatch ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ํ(state)๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋ ํจ์
reducer ํจ์ (=์ํ ๋ณ๊ฒฝ, ๊ด๋ฆฌ ํจ์) ๋ง๋ค๊ธฐfunction reducer(์ํ, ์ก์
๊ฐ์ฒด) {
}
// ์ก์
๊ฐ์ฒด: ์ํ ์
๋ฐ์ดํธ ์ ๋ณด (dispatch ์ธ์๊ฐ)
// ์ฆ, ์ํ๋ฅผ ์ด๋ค ์์ผ๋ก ๋ณ๊ฒฝํ ์ง์ ๋ํ ๋ด์ฉ
Props๋ฅผ ์ ๋ฌํ์ง ์๊ณ ๋ ๋ฉ๋ฆฌ ์๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ณด๋ฅผ ๋ฐ์ ์ ์๊ฒ ํด์คcontext๋ฅผ ์ฝ๊ณ ๊ตฌ๋
ํ๋ Hookcontext ๋ง๋ค๊ธฐconst SomeContext = createContext(๊ธฐ๋ณธ์ํ);
context ๊ฐ์ ธ์ค๊ธฐconst value = useContext(SomeContext);
ref๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋งํ์ง ์๋ ์ ๋ณด ๋ณด์ ๊ฐ๋ฅ (ex. DOM, timeout ID ๋ฑ)state์ ๋ฌ๋ฆฌ, ref๋ ์
๋ฐ์ดํธ๋ฅผ ํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋์ง ์์ref๋ฅผ ์ ์ธํ๋ Hookref ์ ์ธconst ref = useRef(0);
ref ๊ฐ์ ธ์ค๊ธฐref๊ฐ์ฒด ์์๋ ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์์ผ๋ฏ๋ก, {current: 0}
ref.current๋ก ๊ฐ ๊ฐ์ ธ์ค๊ธฐSide Effect๋ฅผ ๋ปํจdocument๋ window์ ๊ฐ์ ๋ธ๋ผ์ฐ์ API์์ ์ํธ์์ฉsetTimeout ๋๋ setInterval๊ณผ ๊ฐ์ ํ์ด๋ฐ ํจ์ ์ฌ์ฉuseEffect(() => {
// ์ฌ์ด๋ ์ดํํธ ๋ก์ง (์ธ๋ถ ์์คํ
๊ณผ ์ฐ๊ฒฐํ๋ ๋ก์ง)
return () => {
// ํด๋ฆฐ์
๋ก์ง (์ฌ์ด๋ ์ดํํธ ์ข
๋ฃํ๋ ๋ก์ง)
};
}, [์์กด์ฑ๋ฐฐ์ด]);
// ์์กด์ฑ๋ฐฐ์ด์ด ์
๋ฐ์ดํธ๋ ๋๋ง๋ค useEffect ์คํ
props๊ฐ ๋ณ๊ฒฝ๋ ๋state๊ฐ ๋ณ๊ฒฝ ๋ ๋const cachedValue = useMemo(๊ณ์ฐํ ํจ์, [์์กด์ฑ๋ฐฐ์ด]);
const cachedFn = useCallback(๊ณ์ฐํ ํจ์, [์์กด์ฑ๋ฐฐ์ด]);