728x90
useReducer란 무엇인가?
React의 useReducer Hook은 상태(state) 관리를 위한 Hooks으로 복잡한 상태 로직을 처리하거나 여러 상태 값을 다뤄야 할 때 유용하다. useState와 비슷한 역할을 하지만 상태 업데이트 로직이 복잡해질수록 useReducer는 훨씬 깔끔하고 유지보수하기 쉬운 코드를 작성할 수 있게 해준다.
useReducer는 리듀서 패턴에 따라 상태와 상태를 변경하는 함수(reducer)를 함께 관리하여 useState보다 더 복잡한 상태 변화를 효율적으로 처리할 수 있도록 설계되었다.
useState vs useReducer
useReducer와 useState는 모두 상태를 관리하는 데 사용되지만 사용 사례가 다를 수 있다.
useState: 간단한 상태 관리에 적합하다. 상태 변화가 단순하고 로직이 복잡하지 않을 때 사용한다.
useReducer: 여러 상태를 관리하거나 상태 변경 로직이 복잡할 때 유리하다. 특히 상태가 여러 값으로 이루어져 있고 다양한 액션에 따라 상태가 변할 때 사용한다.
useReducer 사용방법
const [state, dispatch] = useReducer(reducer, initialArg, init?)
- state: 현재 상태 값을 나타낸다.
- dispatch: 상태를 업데이트하기 위해 액션(action)을 전달하는 함수이다.
- reducer: 상태가 어떻게 업데이트되는지 지정하는 리듀서 함수이다. 순수해야 하고 상태와 동작을 인수로 받아야 하며 다음 상태를 반환해야 한다. (상태와 동작은 어떤 유형이든 가능하다.)
- initialArg: 초기 상태가 계산되는 값이다. 어떤 유형의 값이든 될 수 있고 초기 상태가 어떻게 계산되는지는 다음 init인수에 따라 달라진다.
- 선택 사항 init : 초기 상태를 반환해야 하는 초기화 함수이다. 지정되지 않으면 초기 상태가 "."으로 설정된다. initialArg. 그렇지 않으면 초기 상태가 .을 호출한 결과로 설정됩니다 init(initialArg).
사용예시
- 리듀서 함수: reducer는 두 개의 인수인 state와 action을 받는다. action.type에 따라 상태를 변경하고 새로운 상태를 반환한다.
- dispatch: dispatch는 리듀서 함수로 액션을 전달하여 상태를 변경한다. dispatch({ type: 'increment' })는 상태를 증가시키는 동작을 수행한다.
import React, { useReducer } from 'react';
// 리듀서 함수: 현재 상태와 액션을 받아서 새로운 상태를 반환
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
return state;
}
}
function Counter() {
// useReducer를 사용하여 상태와 dispatch 함수 생성
// reducer함수와 초기 값 count : 0
const [state, dispatch] = useReducer(reducer, { count: 0 });
return (
<div>
<p>Count: {state.count}</p>
{/* dispatch 함수로 액션을 전달하여 상태를 변경 */}
<button onClick={() => dispatch({ type: 'increment' })}>Increment</button>
<button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button>
</div>
);
}
export default Counter;
언제 useReducer를 사용해야 할까?
- 복잡한 상태 로직: 상태가 여러 값으로 이루어져 있거나 복잡한 조건에 따라 상태가 변하는 경우
- 하나의 상태에서 여러 동작이 필요한 경우: 상태를 업데이트할 때 다양한 액션을 처리해야 하는 경우
- 로직을 컴포넌트 바깥으로 분리하고 싶은 경우: 리듀서 함수로 상태 변경 로직을 컴포넌트 외부로 분리할 수 있다.
참고문헌
728x90
'Frontend > React' 카테고리의 다른 글
[React] Hooks - useNavigate (1) | 2024.10.07 |
---|---|
[React] Vite로 react 프로젝트 시작하기 (5) | 2024.09.29 |
[React] Hooks - useRef (0) | 2024.09.29 |
[React] Hooks - useEffect (2) | 2024.09.29 |
[react] Hooks - useState (0) | 2024.09.21 |