Redux-toolkit 深度嵌套平面映射数据不更新状态
Redux-toolkit deeply nested flatmapped data not updating state
我有深度嵌套的数据,需要更新一些深度嵌套的子数据。目前我通过平面映射两个上层列表,然后搜索所有可能的任务,然后通过调用 init 函数改变任务来做到这一点。
const tasks = state.data.flatMap((p) => p.hierarchyLines).flatMap((h) => h?.tasks);
const task = tasks.find((t) => t?.id === payload.id);
task?.init(payload);
task.init(数据:任意):
this.id = _data["id"];
this.start = _data["start"] ? new Date(_data["start"].toString()) : <any>undefined;
this.deadline = _data["deadline"] ? new Date(_data["deadline"].toString()) : <any>undefined;
...
这不起作用,关于为什么它不更新状态有什么建议吗?
如果有人 运行 遇到类似的问题。问题是 immer 不能很好地处理 类。
https://immerjs.github.io/immer/complex-objects
对我来说,解决方案是先复制状态,然后对其进行变异,然后按照此处所述返回副本:https://redux-toolkit.js.org/usage/immer-reducers#immer-usage-patterns
builder.addCase(fetch.fulfilled, (state, { payload }) => {
const stateCopy = _.cloneDeep(state);
stateCopy.loading = false;
const tasks = stateCopy.data.flatMap((p) => p.hierarchyLines).flatMap((h) => h?.tasks);
const task = tasks.find((t) => t?.id === payload.id);
task?.init(payload);
return stateCopy;
});
我有深度嵌套的数据,需要更新一些深度嵌套的子数据。目前我通过平面映射两个上层列表,然后搜索所有可能的任务,然后通过调用 init 函数改变任务来做到这一点。
const tasks = state.data.flatMap((p) => p.hierarchyLines).flatMap((h) => h?.tasks);
const task = tasks.find((t) => t?.id === payload.id);
task?.init(payload);
task.init(数据:任意):
this.id = _data["id"];
this.start = _data["start"] ? new Date(_data["start"].toString()) : <any>undefined;
this.deadline = _data["deadline"] ? new Date(_data["deadline"].toString()) : <any>undefined;
...
这不起作用,关于为什么它不更新状态有什么建议吗?
如果有人 运行 遇到类似的问题。问题是 immer 不能很好地处理 类。 https://immerjs.github.io/immer/complex-objects
对我来说,解决方案是先复制状态,然后对其进行变异,然后按照此处所述返回副本:https://redux-toolkit.js.org/usage/immer-reducers#immer-usage-patterns
builder.addCase(fetch.fulfilled, (state, { payload }) => {
const stateCopy = _.cloneDeep(state);
stateCopy.loading = false;
const tasks = stateCopy.data.flatMap((p) => p.hierarchyLines).flatMap((h) => h?.tasks);
const task = tasks.find((t) => t?.id === payload.id);
task?.init(payload);
return stateCopy;
});