
Reactμ Hook μ€ νλλ‘, 볡μ‘ν μν λ‘μ§μ κ΄λ¦¬νλ λ° μ¬μ©λλ€. useReducerλ νμ¬ μνμ μνλ₯Ό λ³κ²½νκΈ° μν 'μ‘μ 'μ λ°μμ μλ‘μ΄ μνλ₯Ό λ°ννλ ν¨μμ΄λ€.
useStateμ useReducerλ λͺ¨λ Reactμμ μνλ₯Ό κ΄λ¦¬νλ Hookμ΄μ§λ§, κ°κ° λ€λ₯Έ νΉμ±κ³Ό μ©λλ₯Ό κ°μ§κ³ μλ€.
const [state, dispatch] = useReducer(reducer, initialState);
state : νμ¬ μν κ°dispatch : μ‘μ
μ λ°μμν€λ ν¨μreducer : νμ¬ μνμ μ‘μ
μ λ°μ μλ‘μ΄ μνλ₯Ό λ°ννλ ν¨μinitialState : μ΄κΈ° μν κ°useReducerλ μ νμ μΌλ‘ μΈ λ²μ§Έ λ§€κ°λ³μλ₯Ό λ°μ μ μλ€.
const [state, dispatch] = useReducer(reducer, initalArg, init);
μ¬κΈ°μ initμ μ΄κΈ° μνλ₯Ό κ³μ°νλ ν¨μμ΄λ€. μ΄λ₯Ό ν΅ν΄ μ΄κΈ° μν μμ± λ‘μ§μ λΆλ¦¬νκ³ μ¬μ¬μ©ν μ μλ€.
// μ΄κΈ°ν ν¨μ
function init(initialCount) {
return { count: initialCount };
}
// μ¬μ© μμ
const [state, dispatch] = useReducer(reducer, 0 , init);
μ΄ ν¨ν΄μ μ΄κΈ° μνκ° λ³΅μ‘ν κ³μ°μ΄ νμνκ±°λ, μ΄μ μνλ₯Ό 리μ νλ μ‘μ μ΄ μμ λ μ μ©νλ€.
function reducer(state, action) {
switch (action.type) {
case 'INCREMENT':
return { ...state, count: state.count + 1 };
case 'DECREMENT':
return { ...state, count: state.count - 1 };
default:
return state;
}
}
μ΄ ν¨μλ λ κ°μ§ λ§€κ°λ³μλ₯Ό λ°λλ€.
1. state : νμ¬ μν
2. action : μ΄λ€ λ³νλ₯Ό μΌμΌν¬μ§ λνλ΄λ κ°μ²΄ (μΌλ°μ μΌλ‘ type μμ±μ ν¬ν¨)
reducer ν¨μλ νμ μλ‘μ΄ μν κ°μ²΄λ₯Ό λ°νν΄μΌ νλ©°, μλ³Έ μνλ₯Ό μ§μ μμ ν΄μλ μλλ€.
import React, { useReducer } from 'react';
// reducer ν¨μ μ μ
function reducer(state, action) {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
case 'RESET':
return { count: 0 };
default:
return state;
}
}
function Counter() {
// useReducer μ¬μ©
const [state, dispatch] = useReducer(counterReducer, { count: 0 });
return (
<div>
<h1>μΉ΄μ΄νΈ: {state.count}</h1>
<button onClick={() => dispatch({ type: 'INCREMENT' })}>μ¦κ°</button>
<button onClick={() => dispatch({ type: 'DECREMENT' })}>κ°μ</button>
<button onClick={() => dispatch({ type: 'RESET' })}>리μ
</button>
</div>
);
}