Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs Redux更新嵌套的不可变数据_Reactjs_Redux_Nested_Immutability_Updating - Fatal编程技术网

Reactjs Redux更新嵌套的不可变数据

Reactjs Redux更新嵌套的不可变数据,reactjs,redux,nested,immutability,updating,Reactjs,Redux,Nested,Immutability,Updating,我在更新不可变的redux和非常嵌套的数据时遇到了问题。下面是我的数据结构示例,以及我想要更改的内容。如果有人能告诉我使用ES6和spread operator访问此更新的模式,我将不胜感激 我的整个状态是一个具有项目(键/值对-此处仅作为示例一个项目)的对象,这些项目是具有自己的键(键也是ID)的对象、过程数组和任务内部: { 1503658959473: { projectName: "Golden Gate", projectLocation": "San Francisco

我在更新不可变的redux和非常嵌套的数据时遇到了问题。下面是我的数据结构示例,以及我想要更改的内容。如果有人能告诉我使用ES6和spread operator访问此更新的模式,我将不胜感激

我的整个状态是一个具有项目(键/值对-此处仅作为示例一个项目)的对象,这些项目是具有自己的键(键也是ID)的对象、过程数组和任务内部:

{ 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 
                 }
               }
            }
        }
    }
}