[React] useState vs useReducer

2023. 4. 16. 12:55·React/실험실
반응형

상태를 관리할 때 사용하는 것으로 useState와 useReducer 가 있다. 

하지만 일반적으로 useState를 사용하고 useReducer를 사용하는 일은 거의 없었다. 

 

그러다보니 궁금함이 생겼다. 

useReducer는 언제 사용하고, 왜 사용하는 것일까? 

 

먼저 간략하게 둘의 차이를 알아보자.

useState

▶ 간단한 상태 관리

   ▷ 값이 하나인 경우 

   ▷ 상태들이 서로 관련이 없는 경우 

▶ 컴포넌트 내에서 사용

const [state, setState] = useState(initialState);

 

useReducer 

▶ 복잡한 상태 관리

   ▷ 상태들이 서로 관련이 있거나, 참조가 필요한 경우

   ▷ ex) 로그인된 사용자의 권한을 확인하여 다른 화면에 보여줘야 하는 경우 

▶ 여러 컴포넌트에서 상태가 공유되야 하는 경우 

   ▷ Context API 사용 시 사용하는 것이 일반적

▶ reducer를 따로 선언하는 경우 

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

 

정리하면,

useState는 컴포넌트 내에서 관련 없는 상태를 관리하는 경우 사용한다. 

반면 useReducer는 좀 더 복잡한 상태를 관리하며, 여러 컴포넌트에서 사용되는 경우 사용한다. 

 

이것을 예시를 통해서 더 알아보자. 

useState

import { useState } from 'react';

const Counter = () => {
  const [count, setCount] = useState(0);
  
  return (
    <div>
      <p>Count {count}</p>
      <button onClick={() => setCount(prev => prev+1)}>Increment</button>
      <button onClick={() => setCount(prev => prev-1)}>Decrement</button>
    </div>
  )
}

useState하면 많이 나오는 Count 예제이다.

여기서 useState는 count라는 상태를 가지고 있고, 컴포넌트 내에서만 상태를 관리할 때 사용한다. 

 

useReducer

const initialState = {
  products: [],
  categories: [],
  orders: [],
  user: null, 
  searchQuery: '',
  
  // ...
}

e-commerce를 예로 제품, 카테로기, 주문 정보, 사용자 정보, 쿼리 정보 등을 담아야 할 때, 사용했다. 

이것을 useState로 관리하지 않고, useReducer로 관리한 이유는 user를 기준으로 products, orders 등을 넣기 때문이다. 

 

const reducer = (state, action) => {
  switch(action.type) {
    case "SET_PRODUCTS": 
      return { ...state, products: action.payload };
    case "SET_CATEGORY":
      return { ...state, categories: action.payload };
      
    // ...
  }
}

 

지금까지 예시를 통해서 useState와 useReducer를 사용하는 경우를 알아봤다.

하지만 컴포넌트 내부에서는 useState만 사용해도 충분한 경우가 대부분이다. 

useReducer를 사용하는 것이 효율적인 경우는 

  ▶ 관리해야 하는 상태가 많은 경우,

  ▶ 상태들이 서로 관련이 있는 경우,

  ▶ 비즈니스 로직 분리하는 경우, 

  ▶ Immutability

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'React > 실험실' 카테고리의 다른 글

[React] useMemo를 사용하지 말아야 한다!  (0) 2023.04.20
[React] React18에서 추가된 Hook  (0) 2023.04.17
[React] CRA Path Alias 설정하기  (0) 2023.04.11
[React] styled-components theme  (0) 2023.03.20
[React] swiper 부드럽게 흐르는 슬라이드  (0) 2023.03.15
'React/실험실' 카테고리의 다른 글
  • [React] useMemo를 사용하지 말아야 한다!
  • [React] React18에서 추가된 Hook
  • [React] CRA Path Alias 설정하기
  • [React] styled-components theme
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    typescript
    프로그래머스
    타일러영어
    영어회화
    다이소
    CCNA
    ReactNative
    javascript
    리액트
    리얼클래스
    react
    webpack
    타입스크립트
    redux
    next.js
    네이버 부스트캠프
    바질 키우기
    Node.js
    ChatGPT
    알고리즘
    영어독학
    Babel
    자바스크립트
    식물
    바질
    Docker
    CSS
    덤프
    리얼학습일기
    네트워크
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[React] useState vs useReducer
상단으로

티스토리툴바