useReducer
- ์ํ ๊ด๋ฆฌ hook์ค ํ๋(useState์ฒ๋ผ)
- ์ปดํฌ๋ํธ์ ์ํ ์ ๋ฐ์ดํธ ๋ก์ง์ ์ปดํฌ๋ํธ์์ ๋ถ๋ฆฌ ๊ฐ๋ฅ → ์ํ ์ ๋ฐ์ดํธ ๋ก์ง์ ์ปดํฌ๋ํธ ๋ฐ๊นฅ์ ์์ฑ ๊ฐ๋ฅ, ์ฌ์ง์ด ๋ค๋ฅธ ํ์ผ์ ์์ฑ ํ ๋ถ๋ฌ์์ ์ฌ์ฉ ๊ฐ๋ฅ
reducer: ํ์ฌ ์ํ์ ์ก์ ๊ฐ์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์์ ์๋ก์ด ์ํ๋ฅผ ๋ฐํํด์ฃผ๋ ํจ์
function reducer(state, action) {
// ์๋ก์ด ์ํ๋ฅผ ๋ง๋๋ ๋ก์ง
// const nextState = ...
return nextState;
}
- ๋ฐํํ๋ ์ํ๋ ๊ณง ์ปดํฌ๋ํธ๊ฐ ์ง๋ ์๋ก์ด ์ํ๊ฐ ๋จ
- action์ ์ ๋ฐ์ดํธ๋ฅผ ์ํ ์ ๋ณด๋ฅผ ์ง๋๊ณ ์์(๊ฐ์ฒด์ ํํ๋ ์์ ) → type ๊ฐ์ ์ง๋ ๊ฐ์ฒด ํํ๋ก ์ฌ์ฉ
//์นด์ดํฐ์ 1์ ๋ํ๋ ์ก์
{
type: 'INCREMENT'
}
//์นด์ดํฐ์ 1์ ๋นผ๋ ์ก์
{
type: 'DECREMENT'
}
//input ๊ฐ์ ๋ฐ๊พธ๋ ์ก์
{
type: 'CHANGE_INPUT',
key: 'email',
value: 'tester@react.com'
}
//์ ํ ์ผ์ ๋ฑ๋กํ๋ ์ก์
{
type: 'ADD_TODO',
todo: {
id: 1,
text: 'useReducer ๋ฐฐ์ฐ๊ธฐ',
done: false,
}
}
useReducer ์ฌ์ฉ๋ฒ
const [state, dispatch] = useReducer(reducer, initialState);
- state: ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์๋ ์ํ๋ฅผ ๊ฐ๋ฆฌํด
- dispatch: ์ก์ ์ ๋ฐ์์ํค๋ ํจ์ → dispatch({type: ‘INCREMENT’})
- ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ: reducer ํจ์
- ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ: ์ด๊ธฐ ์ํ
import React, { useReducer } from "react";
function reducer(state, action) {
switch (action.type) {
case "INCREMENT":
return state + 1;
case "DECREMENT":
return state - 1;
default:
return state;
}
}
function Counter() {
const [number, dispatch] = useReducer(reducer, 0);
const onIncrease = () => {
dispatch({ type: "INCREMENT" });
};
const onDecrease = () => {
dispatch({ type: "DECREMENT" });
};
return (
<div>
<h1>{number}</h1>
<button onClick={onIncrease}>+1</button>
<button onClick={onDecrease}>-1</button>
</div>
);
}
export default Counter;
function reducer(state, action) {
switch (action.type) {
case "CHANGE_INPUT":
return {
...state,
inputs: {
...state.inputs,
[action.name]: action.value,
},
};
default:
return state;
}
}
- reducerํจ์์์ ์๋ก์ด ์ํ ๋ง๋ค ๋, ๋ถ๋ณ์ฑ ์ง์ผ์ฃผ์ด์ผ ํจ → spread ์ฐ์ฐ์ ์ฌ์ฉ
useReducer vs useState
→ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฆ
ex)
- ์ปดํฌ๋ํธ์์ ๊ด๋ฆฌํ๋ ๊ฐ์ด ํ๋์ด๊ณ , ๊ทธ ๊ฐ์ด ๋จ์ํ ์ซ์ ํน์ ๋ฌธ์์ด, boolean๊ฐ → useState ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ํธ๋ฆฌ
- ์ปดํฌ๋ํธ์์ ๊ด๋ฆฌํ๋ ๊ฐ์ด ์ฌ๋ฌ ๊ฐ๊ฐ ๋์ด์ ์ํ์ ๊ตฌ์กฐ๊ฐ ๋ณต์ก → useReducer๋ก ๊ด๋ฆฌ
'ํ๋ก ํธ์๋ > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Context API (0) | 2022.11.24 |
|---|---|
| ์ปค์คํ Hooks ๋ง๋ค๊ธฐ (0) | 2022.11.24 |
| useCallback, React.memo (0) | 2022.11.24 |
| useEffect์ useMemo (0) | 2022.11.23 |
| ์ปดํฌ๋ํธ ๋ ๋๋ง (0) | 2022.11.23 |