- useState의 대체 함수로, 하나의 컴포넌트에서 여러 개의 state를 다룰 때 사용
- (state, action) => newState의 형태로 reducer를 받고 dispatch 메서드와 짝의 형태로 현재 state를 반환
initalState에 넣어준 값 === state의 초기값, dispatch() = reducer(_,action)- dispatch()는 상태값 변경 함수와 마찬가지로 변하지 않는 값이기에 useEffect(effect)의 의존성 배열에 입력해줄 필요가 없기에 의존성 배열의 사용을 줄이고 싶을 때 useReducer의 사용이 적절
React는 dispatch 함수의 동일성이 안정적이고 리렌더링 시에도 변경되지 않으리라는 것을 보장합니다. 이것이 useEffect나 useCallback 의존성 목록에 이 함수를 포함하지 않아도 괜찮은 이유입니다.
import React,{useState,useEffect,useReducer} from 'react';
export default function App () {
return (
<Counter />
)
}
//주어진 시간을 시/분/초로 환산 후 1초씩 남은 시간이 줄어드는 타이머
const initialState = {count: 100};
function reducer(state, action) {
switch (action.type) {
case 'increment':
return {count: state.count + 1};
case 'decrement':
return {count: state.count - 1};
default:
throw new Error();
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<>
Count: {state.count}
<button onClick={() => dispatch({type: 'decrement'})}>-</button>
<button onClick={() => dispatch({type: 'increment'})}>+</button>
</>
);
}
참고 : https://ko.reactjs.org/docs/hooks-reference.html#usecontext