将 Immer 与 NgRx reducer 集成
Integrate Immer with NgRx reducer
查看 redux 和 ngrx,immer 似乎是在存储之前生成状态副本的推荐库。按照 immer 示例,我将以下代码添加到我的减速器中:
on(exampleActions.updateExample, (state, { example }) => {
return produce((state: ExampleType, draft: ExampleType) => {
draft.push({ example });
draft[1].done = true;
});
})
打字稿抱怨 no-shadowed-variable
,这与示例冲突。此外,我无法 return 没有 return 类型错误的值。
在 example
是多级对象的情况下:
const example = {
a: {
b: { c: 1 }
}
};
draft
也需要完全取消引用。
immer 和 createReducer
集成的示例并不多,因为这是 2019 年的最新更改。我应该禁用 immer 的 no-shadowed-variable
规则还是有更好的模式来确认 state
和 example
都已正确取消引用。 example
是一个多层次的对象。
或者,我可以避免使用 immer 而使用 ramda clone
或尝试手动深度复制所有内容。
这就是 ngrx-etc 使用 mutableOn
函数(使用 Immer)解决的问题
const entityReducer = createReducer<{ entities: Record<number, { id: number; name: string }> }>(
{
entities: {},
},
mutableOn(create, (state, { type, ...entity }) => {
state.entities[entity.id] = entity
}),
mutableOn(update, (state, { id, newName }) => {
const entity = state.entities[id]
if (entity) {
entity.name = newName
}
}),
mutableOn(remove, (state, { id }) => {
delete state.entities[id]
}),
)
可以找到源码here,方向要正确
查看 redux 和 ngrx,immer 似乎是在存储之前生成状态副本的推荐库。按照 immer 示例,我将以下代码添加到我的减速器中:
on(exampleActions.updateExample, (state, { example }) => {
return produce((state: ExampleType, draft: ExampleType) => {
draft.push({ example });
draft[1].done = true;
});
})
打字稿抱怨 no-shadowed-variable
,这与示例冲突。此外,我无法 return 没有 return 类型错误的值。
在 example
是多级对象的情况下:
const example = {
a: {
b: { c: 1 }
}
};
draft
也需要完全取消引用。
immer 和 createReducer
集成的示例并不多,因为这是 2019 年的最新更改。我应该禁用 immer 的 no-shadowed-variable
规则还是有更好的模式来确认 state
和 example
都已正确取消引用。 example
是一个多层次的对象。
或者,我可以避免使用 immer 而使用 ramda clone
或尝试手动深度复制所有内容。
这就是 ngrx-etc 使用 mutableOn
函数(使用 Immer)解决的问题
const entityReducer = createReducer<{ entities: Record<number, { id: number; name: string }> }>(
{
entities: {},
},
mutableOn(create, (state, { type, ...entity }) => {
state.entities[entity.id] = entity
}),
mutableOn(update, (state, { id, newName }) => {
const entity = state.entities[id]
if (entity) {
entity.name = newName
}
}),
mutableOn(remove, (state, { id }) => {
delete state.entities[id]
}),
)
可以找到源码here,方向要正确