[리액트] useReducer 이해하기

2021. 8. 7. 20:04·React/React Basic

Hook을 사용한 함수형 리액트에서는 useState와 값을 전달하는 함수로 상태 변수들을 관리했다.

useState는 반드시 컴포넌트 내부에 선언되어 있어야 하고, 하나의 상태 변수에 대해 여러개의 함수를 정의해서 연산한다.

단순한 구조라면 useState가 간단하지만, state와 관련된 부분을 재 사용해야하거나, 하나의 상태 변수에 관여하는 연산이 많아질 경우 코드의 가독성이 떨어지게 된다.

 

이를 위해 useReducer를 사용한다.

useReducer는 하나의 상태 변수에 관여하는 함수들을 하나로 묶고, 다른 컴포넌트에서도 재 사용 할 수 있도록 해준다.

또, 상태 변수의 관리는 controller에 해당하는 부분이므로 별도의 파일에 useReducer를 정의해서 사용한다면 MVC 형태로도 구축 가능할 것이다.

 

useReducer

정의

//컴포넌트 내부에서 아래와 같이 정의할 수 있다.
const [state, dispatch] = useReducer(myReducer, initialState);

//state는 상태 변수
//dispatch는 함수 호출 : dispatch({type : 'ADD'}) 와 같은 형태로 호출한다.
//myReducer은 reducer의 선언 명
//initialState는 useState의 그것과 같다.
//Reducer는 컴포넌트 외부라면 어디든 선언해도 된다.
function myReducer(state, action){
//action는 dispatch로 전달해준 매개변수이다.
//switch문을 사용해 동작들을 구분해준다.

switch(action.type){
	case 'ADD' :
    	return state + 1;
    case 'MINUS' :
    	return state - 1;
    default : 
    	return state;
	}
}

 

사용

<button onClick=()=>{dispatch({type:'ADD'});}>ADD</button>
<button onClick=()=>{dispatch({type:'MINUS'});}>MINUS</button>

 

마찬가지로 불변성을 위해 object나 list라면 복사하거나 spread가 필요하다.

controller의 역할이 될 수 있으므로, API 혹은 서버와 통신하는 부분으로 사용될 수 있다.

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

'React > React Basic' 카테고리의 다른 글

[React] 불변성을 쉽게 유지하는 Immer lib  (1) 2021.08.08
[React] useContext 및 Context API  (0) 2021.08.08
[React] 불필요한 렌더링 최적화하기  (2) 2021.08.01
[React] useMemo와 useCallback  (0) 2021.08.01
[React] mount시 실행되는 useEffect  (0) 2021.08.01
'React/React Basic' 카테고리의 다른 글
  • [React] 불변성을 쉽게 유지하는 Immer lib
  • [React] useContext 및 Context API
  • [React] 불필요한 렌더링 최적화하기
  • [React] useMemo와 useCallback
박유상의 개발블로그
박유상의 개발블로그
개발블로그
  • 박유상의 개발블로그
    박유상의 개발블로그
    박유상의 개발블로그
  • 전체
    오늘
    어제
    • 전체 (134)
      • Who am I (10)
        • Portfolio (4)
        • Reminiscence (5)
        • Oversea (1)
        • SiliconValley (0)
      • React (36)
        • React Basic (15)
        • React Tech (5)
        • JavaScript (7)
        • TypeScript (3)
        • CSS&HTML (3)
        • Firebase (3)
      • NodeJS (1)
        • NodeJS Basic (1)
      • Flutter (55)
        • Flutter Widget Design (5)
        • Flutter Widget Basic (8)
        • Flutter Tech (18)
        • Flutter Issue (7)
        • Flutter Web (6)
        • About Flutter (2)
        • Firebase (1)
        • Dev Env (1)
        • Dart (7)
      • Programming (31)
        • Web (1)
        • General (0)
        • Algorithm (25)
        • Python (1)
        • VS Code (2)
      • Django (0)
  • 블로그 메뉴

    • Who I AM
    • React
    • NodeJS
    • Flutter
    • Programming
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    파이썬
    TypeScript
    DP
    JSON
    useRef
    자바스크립트
    CSS
    react
    플러터 웹
    Firebase
    JavaScript
    Lingory
    DART
    링고리
    HTML
    탐욕법
    github
    웹
    map
    Flutter
    useState
    useTranslation
    Python
    플러터
    알고리즘
    포트폴리오
    Redux
    프로그래머스
    리액트
    flutter web
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
박유상의 개발블로그
[리액트] useReducer 이해하기
상단으로

티스토리툴바