useReducer를 사용하여 상태업데이트 로직 분리

작업
진행 상태
진행일시
학습자

[ 1. useReducer 란 ? ]

상태를 업데이트 할 때에는 useState를 사용해서 새로운 상태를 설정해주었습니다. 상태를 관리하게 될 때 useState를 사용하는 것말고도 다른방법이 있는데 바로 useReducer 입니다.
useReducer를 사용하면 컴포넌트의 상태 업데이트 로직을 컴포넌트에서 분리시킬 수 있습니다.

[ 1.1 useReducer를 알아보기전 reducer에 알아보자 ]

useReducer Hook 함수를 사용해보기 전 reducer가 무엇인지 알아보겠습니다.
reducer는 현재 상태와 액션 객체를 파라미터로 받아와서 새로운 상태를 반환해주는 함수
[ 예 시 ]
function reducer(state, action) { // 새로운 상태를 만드는 로직 // const nextState = ... return nextState; }
JavaScript
복사
reducer에서 반환하는 상태는 곧 컴포넌트가 지닐 새로운 상태입니다.
여기서 action 은 업데이트를 위한 정보를 가지고 있습니다. 주로 type 값을 지닌 객체 형태로 사용하지만, 꼭 따라야 할 규칙은 따로 없습니다.
[ action의 예시 ]
// 카운터에 1을 더하는 액션 { type: 'INCREMENT' } // 카운터에 1을 빼는 액션 { type: 'DECREMENT' } // input 값을 바꾸는 액션 { type: 'CHANGE_INPUT', key: 'email', value: 'tester@react.com' } // 새 할 일을 등록하는 액션 { type: 'ADD_TODO', todo: { id: 1, text: 'useReducer 배우기', done: false, } }
JavaScript
복사
보신 것 처럼 action 객체의 형태는 자유입니다. type 값을 대문자와 _ 로 구성하는 관습이 존재하기도 하지만, 꼭 따라야 할 필요는 없습니다.
자, 이제 reducer 를 배웠으니 useReducer 의 사용법을 알아봅시다.

[ 1.2 useReducer 사용법 ]

 useReducer 의 사용법은 다음과 같습니다.
const [state, dispatch] = useReducer(reducer, initialState);
JavaScript
복사
여기서 state 는 우리가 앞으로 컴포넌트에서 사용 할 수 있는 상태를 가르키게 되고, dispatch 는 액션을 발생시키는 함수라고 이해하시면 됩니다. 이 함수는 다음과 같이 사용합니다: dispatch({ type: 'INCREMENT' }).
그리고 useReducer 에 넣는 첫번째 파라미터는 reducer 함수이고, 두번째 파라미터는 초기 상태입니다.
그럼, Counter 컴포넌트를 만약에 useReducer 로 구현한다면 어떻게 바뀌는지 알아볼까요?
다음 코드를 한번 따라서 작성해보세요.
reducer에 첫번째 인자는 현재 최신 state값을 전달받고 두번째 인자 action은 dispatch({})에서 보낸
action객체를 받는다.
const reducer = (state, action) => { switch(action.type) { case 1 : return state + 1; case 10 : return state + 10; case 100 : return state + 100; } }
JavaScript
복사