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
)合并到新创建的对象中。