[React] useReducer

Jnary·2024년 4월 8일
0

React

목록 보기
5/10
post-thumbnail

useReducer

  • 상태 관리를 위한 Hook
  • 컴포넌트, 상태 업데이트 로직 분리 ⭐️ → 컴포넌트 외부에서도 상태 관리 가능
  • 여러 값이나 여러 층의 자식 컴포넌트들에 걸쳐있는 상태를 다룰 때 유용
  • useState보다 더 복잡한 상태 로직 다룰 때 사용 → (공식문서 피셜) useState 대체 함수

useReducer 사용법

  • const [state, dispatch] = useReducer(reducer, initialState, init);
  • reducer
    • (state, action) => newState) 형태의 함수
    • 이전 상태와 액션 객체를 받아 새로운 상태 반환
    • 일반적으로 type 필드 포함 → type은 주로 대문자로 구성 (관습)
      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();
      	}
      }
  • initialState
    • reducer의 첫 번째 호출에 사용될 초기 상태
  • init
    • 초기 상태를 지연 초기화하기 위한 함수

      /icons/light-bulb_gray.svg [지연 초기화] 초기 상태값을 설정하는 과정을 컴포넌트가 렌더링되는 시점이 아니라 해당 상태가 필요한 시점까지 늦추는 기법 초기 상태를 설정하는 작업을 지연시켜 필요한 순간에 수행
    • initialState를 인자로 받아 실제 초기 상태를 반환

      function init(initialCount) {
      	return {count: initialCount};
      }
      const [state, dispatch] = useReducer(reducer, initialCount, init);
  • dispatch
    • 액션 발생시키는 함수

    • 액션 객체 인자로 받음

      → 해당 객체는 reducer 함수에 전달
      dispatch({type: 'INCREMENT'})
      dispatch({type: 'DECREMENT'})

사용 사례

  • 다음과 같은 상황에서 useState 보다 더 적합
    • 상태 업데이트 로직이 복잡할 때
    • 다음 상태가 이전 상태에 의존적일 때
    • 여러 하위값이 포함된 상태 객체를 관리할 때
    • 상태 업데이트 로직을 컴포넌트 밖으로 빼내고 싶을 때
  • 예제
    const initialState = {count: 0};
    
    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();
      }
    } // 컴포넌트 외부에 state 업데이트 로직 존재
    
    function Counter() {
      const [state, dispatch] = useReducer(reducer, initialState);
      return (
        <>
          Count: {state.count}
          <button onClick={() => dispatch({type: 'DECREMENT'})}>-</button>
          <button onClick={() => dispatch({type: 'INCREMENT'})}>+</button>
        </>
      );
    }

useState vs. useReducer

useStateuseReducer
state 개수1개1개 이상
state 자료형원시타입복잡한 구조

~일 경우 추천한다!

useReducer 단점

  • 복잡성 증가 : useState 보다 더 많은 보일러플레이트 코드 필요
  • 오버엔지니어링

→ state 가 단순할 경우엔 useState 사용

profile
숭실대학교 컴퓨터학부 21

2개의 댓글

comment-user-thumbnail
2024년 4월 11일

useReducer에 대해 깔끔하게 정리해주셨네요!
useState와 비교해서 언제 사용하는 게 더 적합한지 잘 설명해주신 것 같습니다! useReducer의 단점에 대해 잘 모르고 있었는데 오버엔지니어링이 될 수도 있겠네요 배워갑니다 :)

답글 달기
comment-user-thumbnail
2024년 4월 11일

useState와 useReducer의 비교를 깔끔하게 해주신 점이 인상깊었습니다!!
useReducer 의 사용사례와 단점을 통해 언제 useReducer을 사용하는 것이 좋은지 명확히 알 수 있었습니다! 특히 useReducer가 useState에 비해 복잡성이 증가하고, 오버엔지니어링의 우려가 있어 상태가 단순할 경우에는 useState를 사용하는 것이 더 나을 수 있다는 점을 새롭게 알 수 있었습니다!
좋은 아티클 감사합니다! 수고하셨어요!

답글 달기