반응형
버튼 태그에 setCount 메소드를 onClick 이벤트에 등록해주는데,
setCount의 인자로 함수를 보냅니다.
+ 버튼을 클릭하면 이전상태로부터 1을 증가시키는 함수가 setCount의 인자로 들어가게 됩니다.
간단한 경우에는 useState를 쓰는 것이 더 좋다고 생각하지만
현재의 상태에 액션을 받아서 새로운 상태로 갱신하는(reducer) 형태인 경우 useReducer를 사용해야 합니다.
- 다수의 하윗값을 포함하는 정적 로직을 만드는 경우
- 다음 state가 이전 state에 의존적인 경우
이러한 경우에 useState보다 useReducer가 선호됩니다.
useReducer는 첫 번째 인자로 reducer 함수를 받고, 두 번째 인자로는 initialState 객체를 받습니다.
import React, { useReducer } from 'react';
const initialState = { count: 0 };
const reducer = (state, action) => {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
throw new Error();
}
};
const Counter = () => {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<>
Count : {state.count}
<button onClick={() => dispatch({ type: 'decrement' })}>-</button>
<button onClick={() => dispatch({ type: 'increment' })}>+</button>
</>
);
};
export default Counter;
useReducer는 state와 dispatch를 반환하기 때문에 dispatch로 액션을 보내는 함수를 onClick 이벤트에 등록해 준 것을 알 수 있습니다. 그러면 RESET 버튼은 어떻게 구현할까요?
import React, { useReducer } from 'react';
const init = (initialCount) => {
return { count: initialCount };
};
const reducer = (state, action) => {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
case 'reset':
return init(action.payload);
default:
throw new Error();
}
};
const Counter = ({ initialCount }) => {
const [state, dispatch] = useReducer(reducer, initialCount, init);
return (
<>
Count : {state.count}
<button
onClick={() => dispatch({ type: 'reset', payload: initialCount })}
>
RESET
</button>
<button onClick={() => dispatch({ type: 'decrement' })}>-</button>
<button onClick={() => dispatch({ type: 'increment' })}>+</button>
</>
);
};
export default Counter;
init 함수를 만들어 useReducer의 세 번째 인자로 전달해 주면 됩니다.
잘 동작합니다!
출처: https://clearwater92.tistory.com/26
반응형
'Web > Js' 카테고리의 다른 글
React 컴포넌트에 함수 전달하기 (0) | 2022.02.15 |
---|---|
[React ] Redux와 useReducer의 차이, Context API 사용하기 (0) | 2022.02.14 |
[Vue.js] watch와 computed 의 차이와 사용법 (0) | 2022.01.26 |
vue native event 란? (0) | 2022.01.25 |
[redux-saga] redux-saga 알아보기 (0) | 2022.01.20 |