![](/img/trans.png)
[英]How to update(add and remove) items in redux nested list : Redux, React
[英]trying to remove all items and add incoming items from a nested redux object
我有低于减速器和低于初始 State。 classinfo 是父 state,它有一个嵌套的 state 学生数组。 使用以下减速器,我计划(用新学生替换以前的学生)从以前的 state 中删除所有学生,从“action.data.students”添加新学生并返回一个新的 state。 第一次添加学生时没有问题,当我添加另一个学生时,我收到错误“在调度之间检测到 state 突变”请告诉我,我做错了什么。
classInfo[ { Id:"", students:[] }]
function sampleReducer(state = initialState.classInfo, action) {
switch (action.type) {
case types.ADD_CLASSROOMS:
return [...state, ...action.data];
case types.REMOVE_CLASSROOMS:
return state.filter((class) => class.id !== action.data);
case types.ADD_STUDENT_DETAILS:
const stateObj = state.map((class, i) => {
if (class.id === action.data.id) {
return {
...class,
students: {
...action.data.students,
},
};
}
return {
...class,
};
});
return stateObj;
default:
return state;
}
}
您正在为students
传播 object 。 这是一个数组。 所以使用方括号并传播学生数组 - students: [...action.data.students]
...
case types.ADD_STUDENT_DETAILS:
const stateObj = state.map((class, i) => {
if (class.id === action.data.id) {
return {
...class,
students: [ //<----use square brackets(as its an array)
...action.data.students
],
};
}
return class;
});
return stateObj;
...
你做得很好, do not to mutate the state
只是意味着不要改变prevState
只需更新 state。
主要错误是,您正在尝试更改学生的 state,因为它以前是array
类型,而在更新它时,您将其设置为object
类型只是一个错字。 请使用 [ ] 而不是 { }
const state = { id: 1, students: [ {first: 1}, {second: 2}, {third: 3} ] } const action = { data: { students: [ {fourth: 4} ] } } const updatedStudents = {...action.data.students } console.log(state); console.log(updatedStudents);
所以,在你的情况下->
case types.ADD_STUDENT_DETAILS:
const stateObj = state.map((class, i) => {
if (class.id === action.data.id) {
return {
...class,
students: [
...action.data.students,
],
};
}
return {
...class,
};
});
return stateObj;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.