【发布时间】:2020-05-26 15:14:20
【问题描述】:
避免将不可序列化的值(如 Promises、Symbols、Maps/Sets、函数或类实例)放入 Redux 存储状态或调度的操作。这确保了通过 Redux DevTools 进行调试等功能将按预期工作。它还确保 UI 将按预期更新。
所有其他对象都必须使用 immerable 符号将自己标记为与 Immer 兼容。当其中一个对象在生产者中发生变异时,其原型会在副本之间保留。
class Foo {
[immerable] = true // Option 1
constructor() {
this[immerable] = true // Option 2
}
}
Foo[immerable] = true // Option 3
我知道我可以有一个类实例化简器...但我应该吗?
我假设这样做的危险是时间旅行和 Redux DevTools 可能会被破坏 - 但immer 将防止减速器之外的任何突变。
import { immerable } from "immer";
class MyClass {
constructor() {
this[immerable] = true;
this.data = [];
}
addData(row = "") {
this.data.push(row);
}
prettyPrint() {
this.data.map((txt, index) => console.log(`Row ${index}: ${txt}`));
}
}
const example = createSlice({
name: "example",
initialState: new MyClass(),
reducers: {
addItem: (state, action) => {
state.addData(action.payload);
}
}
});
let state = example.reducer(undefined, example.actions.addItem("Test"));
console.log(state.prettyPrint());
state = example.reducer(state, example.actions.addItem("Test Me too"));
console.log(state.prettyPrint());
console.log(state);
//Will error
// state.addData('Will Error');
这样做的原因是什么?我们在大类中有复杂的业务逻辑。就像在示例中一样,prettyPrint,我们有一些复杂的功能被封装在我们跨反应应用程序使用的类实例中。
我对该方法的另一个想法是在 reducer 中实例化和序列化,以便我们的类实例的 json 表示只存储在 reducer 中。如果我可以避免必须执行实例化 -> 序列化每个操作,并且可以访问状态树上的实用程序函数,那么这将是首选。
【问题讨论】: