2 回答
TA贡献1859条经验 获得超6个赞
这是重写为不可变的减速器:
const { comparators } = state;
const { comparator, name, value } = action.payload;
if (!comparators[comparator]) {
return {
...state,
comparators: {
[comparator]: {
[name]: value
}
}
};
} else {
return !comparators[comparator][name]
? {
...state,
comparators: {
[comparator]: {
[name]: value
}
}
}
: comparators[comparator][name].includes([value])
? {
...state,
comparators: {
[name]: comparators[comparator][name].filter(val2 => val2 !== value)
}
}
: {
...state,
comparators: {
[comparator]: {
[name]: [...comparators.comparator.name, value]
}
}
};
}
TA贡献2016条经验 获得超9个赞
您正在改变 reducer 中的状态,因为您只是复制顶级对象,然后改变嵌套在其中的内容。不可变更新总是需要为对象和数组复制每一层嵌套。
编写 Redux 逻辑的第一条规则是:不要改变状态。
您应该改用我们的官方 Redux Toolkit 包。它不仅会捕捉到这些意外突变并警告您,createSlice
API 还允许您实际编写“突变”代码,这些代码会变成安全、正确的不可变更新。
您还应该花时间阅读关于“不可变更新模式”的 Redux 文档页面,以及 Dave Ceddia 关于React 和 Redux 中不变性的完整指南的帖子。
添加回答
举报