【发布时间】:2019-07-21 20:55:41
【问题描述】:
在下面的代码 sn-p 中,我有一个工作减速器,我认为它是不正确的,因为它重新使用现有状态而不是替换它。它确实有效,但没有任何与我有关的错误。
- 不需要 Object.assign 是否正确?
- 假设它不正确是否应该出现错误?
- 是否有任何工具可以帮助我验证状态更新的正确性?
进入这个 reducer 的状态只是一个简单的数组,其中只有一级对象。也就是说,类似于:
const stateIn = [{id: 101,favorite: 0},{id: 102,favorite: 1},...]
我怀疑的减速器如下:
const speakersReducer = (state, action) => {
switch (action.type) {
case "loadspeakers": {
return action.data;
}
case "favorite": {
return state.map((item, index) => {
if (item.id === action.sessionId) {
// let speakerToUpdate = Object.assign(item);
// speakerToUpdate.favorite = 1;
item.favorite = 1;
return item;
// return speakerToUpdate;
}
return item;
});
}
...
default:
return state;
}
};
export default speakersReducer;
【问题讨论】:
-
它之所以有效,是因为
map的结果是一个新数组,但你是对的,你不应该改变数组中的对象。从 if 语句返回{ ...item, favorite: item.favorite + 1 }是可行的方法。 -
有道理@Tholle 有没有工具可以在我犯这样的错误时警告我?我记得在我使用过的中间件 pre-hook 中有一些东西,但不记得细节了。
-
我不确定。有一些 Eslint 规则可以帮助against mutating state directly,但我不知道有什么可以警告减速器中的突变。可能是 TypeScript 足够聪明,可以给你一个编译时错误,但我不确定。
标签: reactjs react-redux immutability react-hooks