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/