본문 바로가기
Frontend/React.js

리액트 - immer

by Hyeonlog 2022. 11. 3.
728x90

immer: 불변성을 해치는 코드를 작성해도 대신 불변성을 유지해줌

  • immer library 설치가 필요함
  • 필수라이브러리는 아니기때문에 적재적소에 사용하는 것이 중요하다. 무작정 사용하면 안됨
    • update 로직이 까다로운 경우에 사용하는 것이 좋음 간단한 경우에는 크게 의미가 없다.

produce(바꾸고 싶은객체, 어떻게 바꿀지 알려주는 함수)

import produce from 'immer'

window.produce = produce

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

const nextState = produce(state, draft =>{
	draft.number = 2;
} 

//불변성을 지키지 않으면서 변경해도 produce가 값을 지켜줌
//배열도 동일하게 추가 삭제 수정 가능!
//깊은 복사의 개념과 유사한것 같다 

//output:{ number : 2, dontChangeMe } 

기존에 사용했던 업데이트 코드를 immer를 사용하면 조금 더 이해하기 쉬운 코드가 된다.

⇒ 하지만 기존 코드가 엄청나게 이해하기 어려운 것이 아니므로 굳이! 사용하지 않아도 될 것 같다.

return produce(state, draft=>{
          const user = draft.users.find(user => user.id === action.id);
          user.active = !user.active;
        })
//이 경우에는 immer가 더 코드가 이해하기가 명확함.
// return{
//   ...state,
//   users:state.users.map(user=>
//     user.id === action.id ? {...user, active: !user.active} : user)
// };

immer의 성능은 당연히 라이브러리이기 때문에 리액트 자체에 내장된 reducer보다 조금은 느릴 수 밖에 없다. 하지만 오만개를 업데이트한 경우에 비교 속도가 21ms 정도 밖에 되지않기때문에 코드가 현저히 깔끔해 진다면 사용하는 것이 좋을 것 같다.

728x90
반응형

'Frontend > React.js' 카테고리의 다른 글

React - reusable components(with. bulma.css)  (0) 2022.12.15
React - jsx(JavaScript Xml)  (0) 2022.12.13
리액트 - Custom Hook  (0) 2022.10.24
리액트 - useReducer  (0) 2022.10.22
리액트 - useMemo, useCallback, React.memo 알아보기  (0) 2022.10.20