[React] 불변성을 쉽게 유지하는 Immer lib

2021. 8. 8. 15:17·React/React Basic
목차
  1. 설치
  2. 사용
  3. useState와 함께 사용

리액트에서 객체나 리스트는 항상 불변성이 유지되어야한다. (정말 싫다)

spread, map, filter, concat 등 정말정말 불편하다.

이를 쉽게 해주는 Immer 라이브러리가 존재한다.

 

설치

$yarn add immer

//보통 produce로 사용한다.
import produce from 'immer';

 

사용

const myObject = {
  index : 1,
  name : 'park'
};


//produce 함수를 사용하면 간단히 불변성 유지를 하며 요소의 변경이 가능하다.
const nextState = produce(myObject, draft => {
  draft.index += 1;
});

 

useState와 함께 사용

const onClick = useCallback(() => {
//useCallback을 사용하므로 함수형 useState를 사용한다.
  setTodo(
    produce(draft => {
      draft.done = !draft.done;
    })
  );
}, []);

state 매개변수를 생략하게 되면 상태를 반환하는 것이 아니라 함수 자체를 반환해준다.

따라서, 위의 코드에서는 useState를 함수형으로 사용했기에 함수형 immer를 사용한 것이다.

조금 풀어서 적으면 다음과 같이 이해할 수 있다.

 

setTodo(
	todo => {immer(todo);}
		);
        
immer(state) => produce(state, draft) => {
	draft.done = !draft.done;
    }

 

다시 말해 useState 함수형에는 상태가 return 값이 되는 것이 아니라, 상태가 변화되는 연산을 담은 함수가 위치하므로

immer가 이와 같은 방식으로 정의될 수 있는 것이다.

 

 

다만, immer는 전통 방식에 비해 속도가 몇 배정도 느리기때문에, 불변성 유지하는 코드 작성이 까다로운 경우만 사용해야한다.

(사실 성능이 중요한 웹에서 속도가 느리다는 뜻은 쓰지마라는 말과 똑같다. 이런게 있구나 정도로만 이해하고 넘어가자)

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

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

[React] 파일 경로를 깔끔하게 정리하기  (3) 2022.08.29
[React] useContext 및 Context API  (0) 2021.08.08
[리액트] useReducer 이해하기  (0) 2021.08.07
[React] 불필요한 렌더링 최적화하기  (2) 2021.08.01
[React] useMemo와 useCallback  (0) 2021.08.01
  1. 설치
  2. 사용
  3. useState와 함께 사용
'React/React Basic' 카테고리의 다른 글
  • [React] 파일 경로를 깔끔하게 정리하기
  • [React] useContext 및 Context API
  • [리액트] useReducer 이해하기
  • [React] 불필요한 렌더링 최적화하기
박유상의 개발블로그
박유상의 개발블로그
개발블로그
  • 박유상의 개발블로그
    박유상의 개발블로그
    박유상의 개발블로그
  • 전체
    오늘
    어제
    • 전체 (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
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
박유상의 개발블로그
[React] 불변성을 쉽게 유지하는 Immer lib

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.