javascript - 如何在不发生变异的情况下正确更新 redux 数组中的项目?

标签 javascript reactjs redux

const state = [
    {
        list: []
    }
];

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

list: [
   { id: 1, name: "Mark", attendance: true },
   { id: 2, name: "John", attendance: false }
]

我有一个按钮,可以触发对 API 的发布请求,以将出勤率更改为 true。 Post 请求返回已更改的学生对象,例如:

{ id: 2, name: "John", attendance: true }

这工作正常,如果没有错误,将调度 ATTENDANCE_SUCCESS

现在,通过这种设置:

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

最初,我做了:

const studentChanged = newState.list.find(function(student) {
  return (
        student.id ===
        action.res.data.id
  );
});
studentChanged.attendance = true;

但它会改变 redux 存储中的状态(尽管我不确定它到底是如何发生的,因为我假设 newState 已经是一个副本)。

正确的做法是什么?

最佳答案

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

export function students(state, action) {
  switch (action.type) {
    case "ATTENDANCE_SUCCESS":
      if (action.res.errorCode == 0) {
        return state.map(student => {
          // we want to leave non matching items unaltered
          if (student.id !== action.res.data.id) {
            return student;
          }

          return { ...student, attendance: true };
        });
      }

      return state;          
    default:
      return state;
  }
}

这是一个StackBlitz演示功能。

希望有帮助!

关于javascript - 如何在不发生变异的情况下正确更新 redux 数组中的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52306720/

相关文章:

javascript - 单击上一个/下一个按钮,我想突出显示下一个或上一个图像

javascript - 在 JS 中更改鼠标悬停时文本的颜色

javascript - 在 ReactStore 方法中绑定(bind) Scope 以使用 setState()

javascript - Redux dev工具状态图显示reducer正在更新另一个reducer

JavaScript 正则表达式,用于匹配以零次或一次出现的特定字符结尾的任何数字

javascript - React 在添加标签时无法删除重复项

reactjs - 如何 Reactjs 一次链接到和 onclick 事件处理?

javascript - 如何在导入的.map()react.js中使用onClick

javascript - 在输入的 Onchange 上 react 搜索对象数组中的文本

reactjs - 如何在子组件中正确使用mapDispatchToProps函数?