Reactjs Redux更新嵌套的不可变数据
我在更新不可变的redux和非常嵌套的数据时遇到了问题。下面是我的数据结构示例,以及我想要更改的内容。如果有人能告诉我使用ES6和spread operator访问此更新的模式,我将不胜感激 我的整个状态是一个具有项目(键/值对-此处仅作为示例一个项目)的对象,这些项目是具有自己的键(键也是ID)的对象、过程数组和任务内部:Reactjs Redux更新嵌套的不可变数据,reactjs,redux,nested,immutability,updating,Reactjs,Redux,Nested,Immutability,Updating,我在更新不可变的redux和非常嵌套的数据时遇到了问题。下面是我的数据结构示例,以及我想要更改的内容。如果有人能告诉我使用ES6和spread operator访问此更新的模式,我将不胜感激 我的整个状态是一个具有项目(键/值对-此处仅作为示例一个项目)的对象,这些项目是具有自己的键(键也是ID)的对象、过程数组和任务内部: { 1503658959473: { projectName: "Golden Gate", projectLocation": "San Francisco
{ 1503658959473:
{ projectName: "Golden Gate",
projectLocation": "San Francisco",
start:"22/09/1937",
id:1503658959473,
procedures:[
{ title: "Procedure No. 1",
tasks:[
{name: "task1", isDone: false},
{name: "task2", isDone: false},
{name: "task3", isDone: false}
]
}
]
}
}
我愿意做的是将单个任务的“isDone”属性更新为“true”。这是一种切换任务的方式如何在信息更新后返回此状态?
操作创建者将此信息传递给reducer:
export function toggleTask(activeProject, task, taskIndex) {
return {
type: TOGGLE_TASK,
payload: {
activeProject,
task,
taskIndex
}
};
}我自己会创建一个名为
ProjectModel
的新类,它有一个公共方法toggleTask
,可以更新其任务的状态。reducer状态将是一个对象,其键是项目ID,值是ProjectModel
实例。您遇到了Redux的一个常见问题。文档建议您将数据结构扁平化,以使其更易于使用,但如果您不想这样做,我会参考这一点
由于Object.assign()
和…spread
操作符都创建浅拷贝,因此必须遍历对象中的每一层嵌套并重新拷贝它
您的代码可能如下所示
function updateVeryNestedField(state, action) {
return {
...state,
procedures : {
...state.procedures,
tasks : {
return tasks.map((task, index) => {
if (index !== action.taskIndex) {
return task
}
return {
...task,
task.isDone: !task.isDone
}
}
}
}
}
}