Javascript 如何在redux中正确地更新数组中的项而不发生变化?

Javascript 如何在redux中正确地更新数组中的项而不发生变化?,javascript,reactjs,redux,Javascript,Reactjs,Redux,该列表是学生对象的列表,例如: const state = [ { list: [] } ]; 我有一个按钮,可以触发对API的post请求,将考勤更改为true。Post请求返回已更改的学生对象,如: list: [ { id: 1, name: "Mark", attendance: true }, { id: 2, name: "John", attendance: false } ] 这工作正常,如果没有错误,将调度考勤\u SUCCESS

该列表是学生对象的列表,例如:

const state = [
    {
        list: []
    }
];
我有一个按钮,可以触发对API的post请求,将考勤更改为true。Post请求返回已更改的学生对象,如:

list: [
   { id: 1, name: "Mark", attendance: true },
   { id: 2, name: "John", attendance: false }
]
这工作正常,如果没有错误,将调度
考勤\u SUCCESS

现在,通过这种设置:

{ id: 2, name: "John", attendance: true }
起初,我确实:

export function students(state, action) {
    let latestState = state[state.length - 1],
        newState = Object.assign({}, latestState);
    switch (action.type) {
       case "ATTENDANCE_SUCCESS":
          if (action.res.errorCode == 0) {
             // Need to change redux state 'attendance' value to true for a student with ID returned from the POST request
          }
    }
但是它改变了redux存储中的状态(尽管我不确定它到底是如何发生的,因为我假设newState已经是一个副本)


正确的方法是什么?

以下内容将更新数组中的单个项。这里的关键方面是,如果项目的
id
与动作有效负载中的
id
不匹配,它将返回未更改的项目,否则将更新
attention
属性
Array.prototype.map
返回一个新数组,因此它是不可变的

const studentChanged = newState.list.find(function(student) {
  return (
        student.id ===
        action.res.data.id
  );
});
studentChanged.attendance = true;
下面是演示功能的示例


希望这有帮助

以下命令将更新数组中的单个项。这里的关键方面是,如果项目的
id
与动作有效负载中的
id
不匹配,它将返回未更改的项目,否则将更新
attention
属性
Array.prototype.map
返回一个新数组,因此它是不可变的

const studentChanged = newState.list.find(function(student) {
  return (
        student.id ===
        action.res.data.id
  );
});
studentChanged.attendance = true;
下面是演示功能的示例


希望这有帮助

{…学生,出勤率:真的}做什么?这就好像它在复制整个学生对象,但只是将Attention属性更改为不同的值?正确,这是正确的。它实际上是Object.assign(),更简洁。复制所有可枚举属性,然后将其他参数值(在本例中是属性
Attention
)合并到新创建的对象中。{…student,Attention:true}做什么?这就好像它在复制整个学生对象,但只是将Attention属性更改为不同的值?正确,这是正确的。它实际上是Object.assign(),更简洁。复制所有可枚举属性,然后将其他参数值(在本例中为属性
Attention
)合并到新创建的对象中。