221125(๊ธ)
๐ ์ฑ์ฅ์ผ์ง 3.0
์ฑ
ํ๋ณตํ ์ด๊ธฐ์ฃผ์์(์จ์ธ ๋ค์ด์ด)
์ ๋ด์ฉ์ ์๊ทน๋ฐ์ ์์ํ๋ ์๋ฐํ ์ฑ์ฅ๊ธฐ๋ก
์ด์์๋ ๊ฝ๊ณผ ์ฃฝ์ ๊ฝ์ ์ด๋ป๊ฒ ๊ตฌ๋ณํ๋๊ฐ?
์ฑ์ฅํ๊ณ ์๋ ๊ฒ์ด ์ด์ ์๋ ๊ฒ์ด๋ค.
์๋ช ์ ์ ์ผํ ์ฆ๊ฑฐ๋ ์ฑ์ฅ์ด๋ค!
๐ณ ํค์๋ (1.0)
์ต๋ํ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌ, ์ถํ์ ๋ณด๋ฉด์ ์ค์ค๋ก ์ค๋ช
๐ ๊ฒฝํ ์์ฃผ๋ก (2.0)
๋จ์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ธฐ๋ณด๋ค ๋ฌด์์ ๋ฐฐ์ ๊ณ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ์งง๊ณ ๊ฐ๋จํ๊ฒ ์์ฑ
โ๏ธ ์ ํด์ง ํ ํ๋ฆฟ์ ๋ง์ถฐ์ (3.0)
ํค์๋, ๊ฒฝํ ๋ชจ๋ ์ข๋ค. ๋ค๋ง ๋งค์ผ ์์ฑํ๊ธฐ๋ก ๋ง์ ๋จน์๋งํผ ํต์ฌ๋ง ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฆฌํ ์ ์๊ฒ ํ ํ๋ฆฟ์ ์์ฑ
๐ ์ค๋์ ํค์๋
- ๋ฆฌ์กํธ
- useReducer
- ๋ฆฌ๋์ค์ reducer๋ฅผ ๋ฆฌ์กํธ์์ ๊ตฌํํ ํ ์ค
- ๊ด๋ฆฌํ state, setState๊ฐ ๋๋ฌด ๋ง์์ง๊ฒ ๋ ๋, ์ด๋ฅผ ํธ๋ฆฌํ๊ฒ ํ๋์ state ๊ฐ์ฒด๋ก ๊ด๋ฆฌํ๊ฒ ํด์ค๋ค.(์ฝ๊ฐ ํด๋์ค ์ปดํฌ๋ํธ์ state๋ฅผ ๋ฎ์๋ค.)
- state๋ฅผ ๋ณ๊ฒฝํ ๋ dispatch(setState ๋๋)๋ก ๋ณ๊ฒฝํ๊ณ , ์ด ๋ dispatch๊ฐ action๊ฐ์ฒด๋ฅผ ๋๊ธฐ๋ฉด, reducer ํจ์์์ action๊ฐ์ฒด์ type์ ๋ฐ๋ผ ๋ถ๊ธฐ์ฒ๋ฆฌํ์ฌ state๋ฅผ ๋ณ๊ฒฝ, ์กฐ์ํ๋ค.
- ์ข๋ ์ ๊ธฐ์ ์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ๋๋์ด๋ค. ๋จ, state๊ฐ ์ฌ๋ฌ ์ค์ฒฉ๋ ๊ฐ์ฒด๊ฐ ์์ ๊ฒฝ์ฐ ์ฝ๋๊ฐ ์กฐ๊ธ ๋๋ฌ๋ฒ์ง๋ค.(๋ถ๋ณ์ฑ ์ ์ง๋ฅผ ์ํด ๊ณ์ ์์ ๋ณต์ฌํจ) -> ์ด๊ฑธ ํด๊ฒฐํ๊ธฐ ์ํด immer ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
- ๋จ์ํ๊ฒ ์๊ฐํ๋ฉด useReducer(reducer ๊ธฐ๋ฅ)์ Context API(props drilling ํด๊ฒฐ)์ด๋ฉด ๊ตณ์ด redux๋ฅผ ์ธ ์ด์ ๊ฐ ์์ง ์๋? ์ถ์ ์ ์์ง๋ง, ์ค์ ๋น๋๊ธฐ ์ํ๊น์ง ๊ด๋ฆฌํ๋ ๋์ฑ ํฐ ํ๋ก์ ํธ์์๋ ๋ฆฌ๋์ค๋ฅผ ์ฐ๊ฒ ๋๋ค.(๊ทผ๋ฐ ์ฌ์ค ์์ฆ์ ๋ ์๋ฒ ์ํ๋ react-query๋ก ๊ด๋ฆฌํ๋ ์ถ์ธ)
- ์ต์ ํ ํ
- ๊ฐ ์ปดํฌ๋ํธ์ console.log๋ฅผ ์ฐ์ด์ ๋ ๋๋ง ํ์ธ
- useEffect, useRef๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ค props๊ฐ ๋ ๋๋ง ์ ๋ณํ๋์ง ์ฒดํฌํ๋ ๋ฐฉ๋ฒ
- ๊ธฐ๋ณธ์ ์ผ๋ก React.memo๋ฅผ ํตํด ์ต์ ํ(์ธ๋ฐ์์ด ๋ถ๋ชจ ์ปดํฌ๋ํธ ๋ ๋๋ง ์ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ ๊ฒ ๋ง๊ธฐ)
- ์ตํ ์๋จ์ผ๋ก useMemo ํ ์ค๋ฅผ returnํ๋ JSX ํํ์ ์ปดํฌ๋ํธ์๋ ์์ธ ์ ์๋ค.(๊ฒฐ๊ตญ JSX ์ปดํฌ๋ํธ๋ ๊ฐ์ด๋๊น)
- useReducer
๐ ์์ฝ ๋ฐ ํ๋ฃจ ๊ฐ๋จ ํ๊ณ
์ฒ์์ ์ง์ง ๋ฏ์ค๊ณ ํท๊ฐ๋ ธ๋ค. reducer๋ผ๋ ๊ฐ๋ ์ด ๋ญ์ง๋ ๋ชจ๋ฅด๊ฒ ๊ณ , dispatch/action์ ๋ ๋ญ์งโฆ ๊ทธ๋ฆฌ๊ณ ์ ์ฌ์ฉํ์ง๋ ์์๋ switch๋ ๋์ค๊ณ ..! ํ๋ฐ ๊ณ์ ๊ณต๋ถํ๊ณ ์ฌ์ฉํด๋ณด๋, ๊ธ๋ฐฉ ์ต์ํด์ก๋ค. useReducer๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋๋ ๊ฑด, ๋ญ๊ฐ ๊ทธ state๋ค์ ์ ๊ธฐ์ ์ผ๋ก ์ฎ์ด์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๋ ค๋ ๊ฑด ์๊ฒ ๋๋ฐ ๋ญ๊ฐ ์์ฃผ ์์์ํ๊ฒ ํด๊ฒฐ๋์ง๋ ์๋ ๊ธฐ๋ถ..?์ด์๋ค. ๊ฒฐ๊ตญ์ dispatch๋ ์์์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ ค๋ฉด props๋ก ๊ณ์ ์ ๋ฌํด์ค์ผํ๊ณ ์ฌ๋ฌ state๋ค์ ๋ํด์ ์ง์ ๋ถํ๊ฒ setState๋ฅผ ์ํ๋ ๊ฒ๋ ์ข์์ง๋ง, ๊ทธ๋งํผ useReducer ์ฌ์ฉ๋ฐฉ๋ฒ์ด ๋ณต์กํ๊ธฐ์ ํ์ณ์ง๋ ๋๋. ๊ทธ๋๋ ์์ ์ต์ผ๋๊น ํจ์ฌ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด๋ณด์ด๊ณ ๊น๋ํด๋ณด์ด๋ ๊ฑด ์ฌ์ค์ด๋ค.
์์
import React, { useReducer } from 'react';
const initialState = {
name: '',
count: 0,
favorites: [],
};
const SET_NAME = 'SET_NAME';
const reducer = (state, action) => {
switch (action.type) {
case SET_NAME:
return {
...state,
name: action.name,
};
default:
return state;
}
};
const Practice = () => {
const [state, dispatch] = useReducer(reducer, initialState);
const onClick = () => {
dispatch({ type: SET_NAME, name: 'jay' });
};
return (
<>
<h1>{state.name}</h1>
<button onClick={onClick}>ํด๋ฆญ!</button>
</>
);
};
export default Practice;