옝옹
냠
옝옹
전체 방문자
오늘
어제
  • 분류 전체보기 (84)
    • [LG유플러스]유레카 SW (5)
    • React (20)
    • JS (17)
    • TypeScript (5)
    • CSS & HTML (1)
    • 알고리즘 (11)
    • JAVA (20)
    • GIT (1)
    • 자격증 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • JavaScript
  • 자바스트립트
  • map() 함수
  • template literal
  • 리액트를다루는기술
  • 기본api클래스
  • 자바스크립트
  • useEffect
  • do-while문
  • js
  • 함수선언
  • ==
  • 노마드코더
  • reduce
  • 인스턴스멤버
  • useCallback
  • 템플릿리터럴
  • 변수선언
  • useState
  • 혼자 공부하는 자바
  • While문
  • 화살표함수
  • TypeScript
  • 정적멤버
  • fillter
  • match()
  • sort() 메서드
  • 타입변환
  • java
  • useMemo
  • 접근제한자
  • toFixed
  • switch문
  • join() 메서드
  • 리액트
  • join()
  • 자바
  • java.lang패키지
  • java.util패키지
  • 타입스크립트
  • 혼자공부하는자바
  • indexOf()
  • useRef
  • continue문
  • Node.js
  • reverse() 메서드
  • map
  • break문
  • 백준
  • 코드스플리팅

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
옝옹

냠

[React] immer를 사용해 불변성 유지
React

[React] immer를 사용해 불변성 유지

2023. 3. 29. 02:59

 

리액트에서는 배열이나 객체를 업데이트할 때 직접 수정하는 것이 아닌 불변성을 지키며 업데이트 해주어야 한다.

const object = {
  a: 1,
  b: 2
};

// 직접 수정 X
object.b = 3;

// ...연산자 이용해 새로운 객체 생성
const nextObject = {
	...object,
    b : 3
};

객체 뿐만 아니라 배열도 마찬가지로 push, splice 등의 함수를 사용하거나 n번째 항목을 직접 수정하는 것이 아닌 다음과 같이 concat, filter, map 등의 함수를 사용해야 함.

const todos = [
  {
    id: 1,
    text: '할 일 #1',
    done: true
  },
  {
    id: 2
    text: '할 일 #2',
    done: false
  }
];

const inserted = todos.concat({
  id: 3,
  text: '할 일 #3',
  done: false
});

const filtered = todos.filter(todo => todo.id !== 2);

const toggled = todos.map(
  todo => todo.id === 2
    ? {
      ...todo,
      done: !todo.done,
    }
    : todo
);

데이터의 구조가 까다로워지면 코드가 복잡해짐

→  immer를 사용하면 상태를 업데이트 할 때, 불변성을 유지하는 작업을 매우 간단하게 처리 가능

 

사용법(produce 함수)

  • 첫번째 파라미터 : 수정하고 싶은 상태
  • 두번째 파라미터 : 어떻게 업데이트하고 싶을지 정의하는 함수
    • 만약 첫번째 파라미터를 생략하면, 반환 값은 새로운 상태가 아닌 상태를 업데이트해주는 함수가 됨
const state = {
  number: 1,
  dontChangeMe: 2
};

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

console.log(nextState);
// { number: 2, dontChangeMe: 2 }
const [todo, setTodo] = useState({
  text: 'Hello',
  done: false
});

const onClick = useCallback(() => {
  setTodo(
    produce(draft => {
      draft.done = !draft.done;
    })
  );
}, []);

[정리]

  • Immer 라이브러리는 컴포넌트의 상태 업데이트가 조금 까다로울 때 사용하면 좋음
    • 만약 Immer를 사용하는 것이 오히려 불편하게 느껴진다면 사용하지 않아도 좋음
    • 성능적으로는 Immer를 사용하지 않은 코드가 조금 더 빠름
      • 어쩔 수 없을 때 필요한 곳에만 사용하는 것이 좋음
  • 배열이 객체의 깊은곳에 위치하지 않는 경우 immer를 사용하는 것 보단 concat과 filter를 사용하는 것이 편함

 

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

'React' 카테고리의 다른 글

[React] Context API  (0) 2023.04.05
[React] 라우팅  (0) 2023.03.30
[React] 컴포넌트 스타일링  (1) 2023.03.23
[React] Hooks  (0) 2023.03.23
[React] 컴포넌트의 라이프사이클 메서드  (1) 2023.03.23
    'React' 카테고리의 다른 글
    • [React] Context API
    • [React] 라우팅
    • [React] 컴포넌트 스타일링
    • [React] Hooks
    옝옹
    옝옹

    티스토리툴바