React

[React] Hooks - useReducer

wwxs 2024. 9. 6. 17:24

useReducer

 

useState VS useReducer

 

1) useState

  • const [state, setState] = useState<stateType>(initialValue);
  • 리액트에서 가장 기본적인 상태 관리 Hook

2) useReducer

  • const [state, dispatch] = useReducer(reducer, initialValue)
  • 복잡한 상태 로직을 관리하는데 useState보다 적합
  • 상태 업데이트 로직을 외부에서 선언 가능  (재사용성 용이)

 

useReducer의 기본 구조

  • reducer 함수
    • useReducer에 인자로 전달되는 함수
    • 상태 변경 로직을 포함(switch, case)하고 이전 상태와 액션 객체를 인자로 받아 새로운 상태를 반환
  • initialValue
    • 리듀서의 초기 상태를 정의 (상태의 초기값)
  • state
    • 현재 상태 값 (관리되는 데이터)
더보기
더보기
더보기
export type CountState = {
  count: number;
}
export type CountAction = { type: 'increment' } | { type: 'decrement' }

export function reducer(state: CountState, action: CountAction): CountState {
  switch(action.type) {
    case 'increment':
      return {count: state.count + 1}
    case 'decrement':
      return {count: state.count - 1}
  }
}

export default function UseReducer01() {
  const [count, setCount] = useState<number>(0);
  const [state, dispatch] = useReducer(reducer, {count: 0});

  const handleIncrement = () => {
    setCount(prevCount => prevCount + 1);
  }
  const handleDecrement = () => {
    setCount(prevCount => prevCount - 1);

  }
  return (
    <div>
      <h2>useState를 사용한 상태관리</h2>
      <p>count: {count}</p>
      <button onClick={handleIncrement}>증가</button>
      <button onClick={handleDecrement}>감소</button>

      <h2>useReducer를 사용한 상태관리</h2>
      <p>count: {state.count}</p>
      <button onClick={() => dispatch({type: 'increment'})}>증가</button>
      <button onClick={() => dispatch({type: 'decrement'})}>감소</button>
    </div>
  )
}
import React, { useReducer } from 'react'
import { reducer } from './UseReducer01';

export default function UseReducer02() {
  const [state, dispatch] = useReducer(reducer, {count: 0});
  return (
    <div style={{backgroundColor: 'pink'}}>
      <h3>리듀서 함수 재사용</h3>
      <p>count: {state.count}</p>
      <button onClick={() => dispatch({type: 'increment'})}>증가</button>
      <button onClick={() => dispatch({type: 'decrement'})}>감소</button>
    </div>
  )
}

'React' 카테고리의 다른 글

[React] Router  (0) 2024.09.06
[React] Hooks - customHook  (0) 2024.09.06
[React] Hooks - useCallback + useMemo  (0) 2024.09.06
[React] Hooks - useEffect  (0) 2024.08.31
[React] Hooks - useRef  (0) 2024.08.31