본문 바로가기
React

useReducer를 통한 상태관리(reducer, dispatch, action)

by @kkkk_biiin 2023. 12. 6.
728x90

useReducer

 state 관리를 위한 hook으로 여러 하위 값을 가지는 state와 같이 복잡한 state를 다뤄야 할 때 useState 대신 사용할 수 있는 hook이다.

 

 useReducer를 사용하기 위해선 먼저 reducer와 dispatch, action에 대해 알아야 한다. 은행을 예로 들었을 때 은행의 역할은 예금자에 요구에 의해 입금 혹은 출금을 해주는 역할을 한다. useReducer에서 reducer가 이러한 역할을 한다. 그리고 예금자가 은행에 입금 또는 출금을 요구해야 은행은 그 동작을 수행하는데, useReducer에서는 이 역할을 dispatch라고 한다. 그리고 요구의 내용을 action이라고 하며, 이러한 과정을 통해 잔고가 변화하게 되는데, 이때 잔고를 state라고 보면 될 것 같다. 

 

 즉 은행을 reducer, 예금자의 요구를 dispatch, 요구 내용을 action, 통장 잔고를 state로 보면 된다.

 

 

useReducer 구조

 구조는 아래와 같이 useRedecer는 reducer와 초기값을 인자로 받게 된다.

 

const [state, dispatch] = useReducer(reducer, initialState)

 

 

 

reducer 구조

 useReducer의 인자로 사용되는 reducer는 state와 action을 받는 함수로 되어있으며, return 값에 의에 초기 state가 변화하게 된다.

 

const reducer = (state, action) => {}

 

 

 

은행 입출금 예시 코드

  • reducer
    • 보통 action Type에 의해 return 값을 다르게 해야 하기 때문에 switch문을 주로 사용한다. 
  • dispatch
    • 객체를 인자로 받으며, 식별할 수 있는 type과 수정해야 하는 값인 payload를 포함해야 한다.
    • dispatch를 통해 type과 action을 넘겨주게 되면 이 값을 포함한 초기 state에 의해 reducer 함수가 실행되고, reducer에서 설정한 로직대로 state를 변경시켜 준다.
const ACTION_TYPES = {
   deposit: 'deposit'
   withdraw: 'withraw'
}

const reducer = (state, action) => {
   switch (action.type) {
      case ACTION_TYPES.deposit:
         return state + action.payload
      case ACTION_TYPES.withdraw:
         return state - action.payload
      default:
         return state
         
         
function App() {
   const [number, setNumber] = useState()
   const [money, dispatch] = useReducer(reducer, 0)
   
   return (
      <div>
         <p> 잔고: {money}원 </p>
         <input 
            type: 'number'
            value: {number}
            onChange= { (e) => setNumber(parseInt(e.target.value))}
            step: '1000'
         />
         <button
            onClick={ () => {
               dispatch({type: ACTION_TYPE.deposit, payload: number})
            }}
         > 예금 </button>
         <button
            onClick={ () => {
               dispatch({type: ACTION_TYPE.withraw, payload: number})
            }}
         > 출금 </button>
      </div>
   )

 

 

 

 

 

Reference
https://goddaehee.tistory.com/311

https://www.youtube.com/watch?v=tdORpiegLg0&list=PLZ5oZ2KmQEYjwhSxjB_74PoU6pmFzgVMO&index=8&t=79s 
728x90

'React' 카테고리의 다른 글

Custom Hooks  (1) 2023.12.07
Context API의 기초적인 사용방법(useContext)  (0) 2023.12.02
useCallback을 활용한 성능 최적화  (0) 2023.11.29
useMemo를 사용한 성능 최적화  (1) 2023.11.27
SSE 실시간 알림 기능 구현  (0) 2023.11.20