본문 바로가기
Front-End/React

[React] Immer를 사용한 불변성 지키기

by 민바이민 2021. 5. 20.

 

immer를 사용하면 불변성을 해치는 코드를 작성해도 대신 불변성 유지를 해줍니다.

우리는 보통 배열을 변경할 때 합칠때는 concat, 찾거나 뺄 때는 filter, 리스트를 뿌릴 때는 map을 사용하여 불변성을 지켜주면서 배열을 수정합니다.

허나 immer를 사용하면, push나 직접적인 값 설정이 가능해집니다.

 

먼저 immer를 설치해줍니다.

$yarn add immer 또는 $npm i immer

 

그리고 상단에 

import produce from "immer";

를 작성해주고 immer로 사용해도 되지만, 보통 produce로 많이 사용합니다.  

 

produce 함수를 사용 할 때에는 첫번째 파라미터에는 수정하고 싶은 상태, 두번째 파라미터에는 어떻게 업데이트하고 싶을지 정의하는 함수를 넣어줍니다.

두번째 파라미터에 넣는 함수에서는 불변성에 대해서 신경쓰지 않고 그냥 업데이트 해주면 다 알아서 해줍니다.

const state = {
  number: 1,
  dontChangeMe: 2
};

const nextState = produce(state, draft => {
  draft.number += 1;
});

console.log(nextState);
// { number: 2, dontChangeMe: 2 }

 

이런 것도 사용해 볼 수 있겠네요.

const array = [
  { id: 1, text: 'hello'},
  { id: 2, text: 'bye'},
  { id: 3, text: 'lalala'}
]

const nextArray = produce(array, draft => {
  draft.push({id:4, text: 'blabla'});
  draft[0].text = draft[0].text + 'world';
})

nextArray;
=> (4) [{…}, {…}, {…}, {…}]
0: {id: 1, text: "helloworld"}
1: {id: 2, text: "bye"}
2: {id: 3, text: "lalala"}
3: {id: 4, text: "blabla"}
length: 4
__proto__: Array(0)

array;
=>(3) [{…}, {…}, {…}]
0: {id: 1, text: "hello"}
1: {id: 2, text: "bye"}
2: {id: 3, text: "lalala"}
length: 3
__proto__: Array(0)

 

보시면 array는 건들지 않고, nextArray로 새로 만들어 사용한 것을 확인할 수 있습니다.

'Front-End > React' 카테고리의 다른 글

[React] react-async 라이브러리  (0) 2021.06.01
[React] class형 컴포넌트  (0) 2021.05.21
[React]배열 렌더링하기  (0) 2021.05.13
[React] ref: Dom에 이름 달기 (useRef)  (0) 2021.05.13
[React] React에서 SASS, SCSS 사용하기  (0) 2021.03.27

댓글