跳到主要内容

immer

immer 基础

immer
  • react 不可变数据库;
  • 解决 react 要求变量不可变的要求;
安装
npm install immer
工作原理
  • 根据 currentState 创建 draft;
  • 你可以修改 draft;
  • immer 根据 draft 形成 nextState;
produce
  • baseState:起始状态;
  • recipe:修改操作,draftState 恒为第一个参数,baseState 的代理;
// produce(baseState, recipe: (draftState, ...args) => void): nextState
const nextState = produce(baseState, (draftState) => {
draftState.push({ title: "Tweet about it" });
draftState[1].done = true;
});

最佳实践

返回 draft
// immer 是通过 proxy 实现
// 因此本例中返回的是一个 ModelStatus 对象的 proxy, 并不是 ModelStatus 对象本身
removeModelStatus: (key) => {
let model: ModelStatus;
set(
produce((draft: ModelStatusStore) => {
model = draft.modelStatus.filter((ms) => ms.value === key)[0];
})
);
return model;
};

useState

// state 修改操作
setTodos(
produce((draft) => {
const todo = draft.find((todo) => todo.id === id);
todo.done = !todo.done;
})
);
// state 添加操作
setTodos(
produce((draft) => {
draft.push({
id: "todo_" + Math.random(),
title: "A new todo",
done: false,
});
})
);

zustand

import create from "zustand";
import produce from "immer";

export const useStore = create((set) => ({
kdramas: [],
// 添加操作
addDrama: (value) =>
set(
produce((draft) => {
draft.kdramas.push(value);
})
),
// ...
}));