useReducer(reducer, initialArg, init?)
๋งค๊ฐ๋ณ์
reducer
- state๊ฐ ์ ๋ฐ์ดํธ ๋๋ ๋ฐฉ์์ ์ง์ ํ๋ reducerํจ์์ ๋๋ค.
- state์ action์ ์ธ์๋ก ๋ฐ์์ผํ๊ณ ๋ค์ state๋ฅผ ๋ฐํํด์ผํฉ๋๋ค.
initialArg
- ์ด๊ธฐ state๊ฐ ๊ณ์ฐ๋๋ ๊ฐ์ ๋๋ค.
- optional
init
- ์ด๊ธฐ state ๊ณ์ฐ ๋ฐฉ๋ฒ์ ์ง์ ํ๋ ์ด๊ธฐํ ํจ์์ ๋๋ค.
์ฃผ์์ฌํญ
Strict Mode์์ React๋ ์๋์น ์์ ๋ถ์๋ฌผ์ ์ฐพ๊ธฐ ์ํด reducer์ ์ด๊ธฐํ ํจ์๋ฅผ ๋๋ฒ ํธ์ถํฉ๋๋ค.
dispatch
function
useReducer
๊ฐ ๋ฐํํ๋ dispatch
ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด state๋ฅผ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์
๋ฐ์ดํธํ๊ณ ๋ค์ ๋ ๋๋ง์ ์ด๋ฐํ ์ ์์ต๋๋ค.React๋
reduce
ํจ์์ ํ์ฌ state
์ dispatch
ํ ์ก์
์ ์ ๋ฌํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ state๋ก ์ค์ ํฉ๋๋ค.๋งค๊ฐ๋ณ์
action
- ์ฌ์ฉ์๊ฐ ์ํํ ์์ ์ ๋๋ค.
- ๊ด์ฉ์ ์ผ๋ก๋ ์ก์ ์ ๋ณดํต ์ด๋ฅผ ์๋ณํ๋ type ์์ฑ์ด ์๋ ๊ฐ์ฒด์ด๋ฉฐ, ์ ํ์ ์ผ๋ก ์ถ๊ฐ ์ ๋ณด๊ฐ ์๋ ๋ค๋ฅธ ์์ฑ์ ํฌํจํ ์ ์์ต๋๋ค.
์ฃผ์์ฌํญ
dispatch
ํจ์๋ ๋ค์ ๋ ๋๋ง์ ๋ํ state ๋ณ์๋ง ์ ๋ฐ์ดํธํฉ๋๋ค.
- React๋ ์ปดํฌ๋ํธ์ ๊ทธ ์์๋ค์ ๋ค์ ๋ ๋๋งํ๋ ๊ฒ์ ๊ฑด๋๋๋๋ค.
import { useReducer } from 'react'; function reducer(state, action) { if (action.type === 'incremented_age') { return { age: state.age + 1 }; } throw Error('Unknown action.'); } export default function Counter() { const [state, dispatch] = useReducer(reducer, { age: 42 }); return ( <> <button onClick={() => { dispatch({ type: 'incremented_age' }) }}> Increment age </button> <p>Hello! You are {state.age}.</p> </> ); }
ํจ์
state๋ ์ฝ๊ธฐ ์ ์ฉ์ ๋๋ค. state์ ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์์ ํ์ง ๋ง์ธ์
function reducer(state, action) { switch (action.type) { case 'incremented_age': { // ๐ฉ Don't mutate an object in state like this: state.age = state.age + 1; return state; }
๋์ reducer๋ก ๋ถํฐ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉด ๋๋ค.
function reducer(state, action) { switch (action.type) { case 'incremented_age': { // โ Instead, return a new object return { ...state, age: state.age + 1 }; }
ย
ย