๐
Hooks์ ์ข ๋ฅ
December 23, 2022
Hooks๊ฐ ๋ฑ์ฅํ ์ด์
-
๊ธฐ์กด์ ํด๋์ค ๋ฌธ๋ฒ์์ ์ฌ์ฉํ์๋ ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋ ๊ธฐ๋ฐ์
๊ด๋ จ ์๋ ๋ก์ง์ด ์์ฌ ์ฝ๋๊ฐ ์์ฑ๋๋ ๊ฒฝ์ฐ๊ฐ ์์๊ณ ๊ทธ๋ก ์ธํด์ ๋ฒ๊ทธ๊ฐ ์ฝ๊ฒ ๋ฐ์ํ๊ณ , ๋ฌด๊ฒฐ์ฑ์ ํด์น๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ค.
๋๋ฌธ์๋ก์ง ๊ธฐ๋ฐ์ผ๋ก
๋๋ ์ ์๊ณ ์ปดํฌ๋ํธ๋ฅผ ํจ์ ๋จ์๋ก ์๊ฒ ์ชผ๊ฐค ์ ์๋React Hooks
๊ฐ ๋์ ํจ์ ์ปดํฌ๋ํธ๋ก ์์ฑํ๊ฒ ๋์๋ค. -
Hooks์ ์ด์ฉํ๊ธฐ ์ํด์๋
์ต์์
์์๋ง ํธ์ถํด์ผํ๋ฉฐ,๋ฐ๋ณต๋ฌธใป์กฐ๊ฑด๋ฌธใป์ค์ฒฉ๋ ํจ์
๋ด์์ Hook์ ์คํํ๋ฉด ์ ๋๋ค.
-
์ด ๊ท์น์ ๋ฐ๋ฅด๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ๋์ผํ ์์๋ก ํธ์ถ๋๋ ๊ฒ์ ๋ณด์ฅํ ์ ์๋ค.
Hooks์ ์ข ๋ฅ
useState
- ์ํ๋ฅผ ๋ณ์๋ก ์ ์ธํ์ฌ ๊ด๋ฆฌํ๋ฉฐ, ์ํ์ ๋ถ๋ณ์ฑ์ ์ ์งํ ์ฑ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋๋ก ๋์์ค๋ค.
- [state, setState]์ ์ธ์๋ก๋
- state: ์ํ์
ํ์ฌ ๊ฐ์ด ํํ
๋๊ณ ์ด๊ธฐ์๋ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ์ด๊ธฐ ์ํ๋ก ์ค์ ๋์ด ํํ - setState: ์ํธ ์์ฉ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ
- state: ์ํ์
const [state, setState] = useState(initialState);
useEffect
- ์ปดํฌ๋ํธ ๋ด์
๋ณํ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ
์ ์คํ๋๋ ๋ฉ์๋ - ํ๋ฉด์ ๋ ๋๋ง์ด ์๋ฃ๋ ํ์ ์ํ๋๋ค.
- useEffect(function, โฆdependencies?);
- function : useEffect๊ฐ ์ํ๋ ๋ ์คํ๋๋ ํจ์
- deps [optional] : ๋ฐฐ์ด ํํ์ด๋ฉฐ, ์์กด(dependency) ๊ฐ์ ์๋ฏธ
- useEffect์์์์ return์
์ ๋ฆฌ ํจ์(clean-up)
๋ฅผ ์ฌ์ฉํ๊ธฐ์ํด ์ฐ์ฌ์ง๋๋ค.- ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง๋ฅผ ์ํด UI์์ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ ์ ์ํํ๋ค.
- ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฌ ๋ฒ ๋ ๋๋ง ๋๋ค๋ฉด ๋ค์ effect๊ฐ ์ํ๋๊ธฐ ์ ์ ์ด์ effect๊ฐ ์ ๋ฆฌ๋๋ค.
useEffect(() => {}); // ๋ ๋๋ง ๊ฒฐ๊ณผ๊ฐ ์ค์ ๋์ ๋ฐ์๋ ๋ ๋ง๋ค ํธ์ถ
useEffect(() => {}, []); // ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ํ๋ ๋ ํ ๋ฒ ํธ์ถ
useEffect(() => {}, [dependencies1, dependencies2, ...]); // ์กฐ๊ฑด๋ถ effect ๋ฐ์, ์์กด์ฑ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด, ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๋ค.
useRef
- useState๋ ์ํ์ ๊ฐ์ด ๋ณํ๋ฉด ๋ ๋๋ง์ด ์ผ์ด๋์ง๋ง, useRef๋ ์ํ์ ๊ฐ์ด ๋ณํ๋๋ผ๋ ๋ ๋๋ง์ ์ผ์ผํค์ง ์๋๋ค.
- ํน์ DOM ์์์ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ํธ์ด๋ฉฐ,
.current
ํ๋กํผํฐ๋ก ์ ๋ฌ๋ ์ธ์๋ก ์ด๊ธฐํ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ref ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. (JavaScript์ Document.querySelector์ ๋น์ทํ ๊ธฐ๋ฅ) - ๋ฐํ๋ ๊ฐ์ฒด๋ ์ปดํฌ๋ํธ์ ์ ์์ ์ฃผ๊ธฐ๋ฅผ ํตํด ์ ์ง๋๋ค.
const refContainer = useRef(null);
useMemo
- ๋ฉ๋ชจ์ด์ ์ด์ ๋ ๊ฐ์ ๋ฐํํ๋ค.
- ์ด๋ฏธ ์ฐ์ฐ ๋ ๊ฐ์ ๋ฆฌ๋ ๋๋ง ์ ๋ค์ ๊ณ์ฐํ์ง ์๋๋ก ํ๋ค.
- ์์กด์ฑ์ด ๋ณ๊ฒฝ๋์์ ๋์๋ง ๋ฉ๋ชจ์ด์ ์ด์ ๋ ๊ฐ๋ง ๋ค์ ๊ณ์ฐํ๋ค.
- ์์กด์ฑ ๋ฐฐ์ด์ด ์๋ ๊ฒฝ์ฐ ๋งค ๋ ๋๋ง ๋๋ง๋ค ์ ๊ฐ์ ๊ณ์ฐํ๋ค.
- ์ ์์ฌํญ: ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ useMemo๋ก ๊ฐ์ธ๊ฒ ๋๋ฉด ์ด ๋ํ ๋ฆฌ์์ค ๋ญ๋น์ด๋ฏ๋ก, ํผํฌ๋จผ์ค ์ต์ ํ๊ฐ ํ์ํ ์ฐ์๋์ด ๋ง์ ๊ณณ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
useCallback
- ๋ฉ๋ชจ์ด์ ์ด์ ๋ ์ฝ๋ฐฑ์ ๋ฐํํ๋ค.
- useMemo์ ์ ์ฌํ๊ฒ ์ด์ฉ๋๋ฉฐ, โํจ์โ์ ์ ์ฉํด์ค๋ค.
- ์์กด์ฑ์ด ๋ณ๊ฒฝ๋์์๋๋ง ๋ณ๊ฒฝ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํน์ ํจ์๋ฅผ ์๋ก ๋ง๋ค์ง ์๊ณ ์ฌ์ฌ์ฉ๊ฐ๋ฅํ๊ฒ ํ๋ค.
const memoizedCallback = useCallback(() => {
doSomething(a, b);
}, [a, b]);
useContext
- Context API๋ฅผ ํตํด ๋ง๋ค์ด์ง Context์์ ์ ๊ณตํ๋ Value๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
- ์ปดํฌ๋ํธ์์ ๊ฐ์ฅ ๊ฐ๊น์ด <MyContext.Provider>๊ฐ ๊ฐฑ์ ๋๋ฉด ์ด Hook์ ๊ทธ MyContext provider์๊ฒ ์ ๋ฌ๋ ๊ฐ์ฅ ์ต์ ์ context value๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋๋ฌ๋ฅผ ํธ๋ฆฌ๊ฑฐ ํ๋ค.
const value = useContext(MyContext);
useReducer
- useState์ ๋์ฒด ํจ์๋ก ์ปดํฌ๋ํธ ์ํ ์ ๋ฐ์ดํธ ๋ก์ง์ ์ปดํฌ๋ํธ์์ ๋ถ๋ฆฌ์ํฌ ์ ์๋ค.
- ์ปดํฌ๋ํธ ๋ฐ๊นฅ์ ๋ก์ง์ ์์ฑํ ์ ๋ ์๊ณ , ์ฌ์ง์ด ๋ค๋ฅธ ํ์ผ์ ์์ฑํ ํ ๋ถ๋ฌ์์ ์ฌ์ฉํ ์๋ ์๋ค.
- reducer๋ ํ์ฌ ์ํ์ ์ก์ ๊ฐ์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์์ ์๋ก์ด ์ํ๋ฅผ ๋ฐํํด์ฃผ๋ ํจ์์ด๋ค.
const [state, dispatch] = useReducer(reducer, initialArg, init);