포스트

Effic 개발일지 - Day 7

Effic 개발 일지 : 7일차

할 일

  • zustand redux 개발자 도구 설정
  • zustand store에 immer 적용하여 state 업데이트

zustand 에서 TS를 이용해 redux-devtools를 이용하는 방법

zustand에서는 크롬 확장 중 하나인 redux-devtools를 이용해 redux와같이

크롬 개발자 도구에서 확인할 수 있다.

https://docs.pmnd.rs/zustand/guides/typescript#using-middlewares

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// todoStore
import { create } from "zustand";
import { devtools, persist } from "zustand/middleware";

export const useTodoStore = create<IStore>()(
  devtools(
    persist(
      (set) => ({
        todos: initialTodos,
        addTodo: (todo: ITodo) =>
          set((state) => ({ todos: [...state.todos, todo] })),
      }),
      { name: "todoStore" }
    )
  )
);
  • zustand/middleware 패키지의 devtools와 persist를 이용한다.
  • devtools와 persist를 추가하면, 크롬 개발자 도구에서 redux devtools를 통해 zustand 스토어를 확인할 수 있다.
  • devtools로 개발자 도구 사용을 true로 변환
  • persist를 통해, 인수인 name option의 이름으로 브라우저 store에 해당 store를 저장

zustand 에 immer 적용

기존의 zustand에서는 store에 정보를 변경할 때 , 객체의 얕은 병합을 통해 상태를 업데이트 할 수 있었는데

immer middleware를 적용하면, redux-toolkit으로 상태를 변경하는 것처럼

상태의 불변성을 유지하면서, 더욱 간단한 실행코드, 할당문으로 상태르 변경할 수 있고,

복잡한 변경 처리가 더 쉬워진다. (개인적)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import { produce } from "immer";
import { v4 } from "uuid";
import { create } from "zustand";
import { devtools, persist } from "zustand/middleware";
import { immer } from "zustand/middleware/immer";

export const useTargetStore = create<ITargetStroe>()(
  devtools( // devtools 적용 1
    persist( // devtools 적용 2
      immer((set) => ({ //immer 적용 부분
        targets: initialTargets,
        addTarget: (target: TTarget) =>
          set((state: ITargetStroe) => {
            state.targets.push(target);
            // targets: [...state.targets, target],
          }),
        removeTarget: (targetId: string) =>
          set((state: ITargetStroe) => {
            state.targets = state.targets.filter(
              (target) => target.id !== targetId
            );
          }),
        updateTarget: (target: TTarget) =>
          set((state: ITargetStroe) => {
            const { id, content } = target;
            state.targets = state.targets.map((target) =>
              target.id === id
                ? {
                    id: id,
                    content: content,
                  }
                : target
            );
          }),
      })),
      { name: "targetStore" }
    )
  )
);

  • immer로 set으로 이루어 지는 모든 부분을 감싸서, 객체 불변 업데이트 방식을 적용하였다.
  • 위 처럼 immer로 감싸는 방법 외에도 immer 라이브러리의 produce를 이용하는 방법도 존재한다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.