我遇到了以下redux reducer,虽然工作正常,但我认为这是错误的:
export default (state = initState, action) => {
switch (action.type) {
case RESET_SCREEN:
return Object.assign({}, state, initState);
case MODIFY_ITEM:
let itemId = state.item.id;
state.items[itemId].item = action.item;
return Object.assign({}, state, {items: state.items});
}
}
由于RESET_SCREEN不会改变状态而正确,但是MODIFY_ITEM部分却由于改变而不好,这是正确的吗?在什么情况下会疼? (因为该应用当前的行为符合预期)
MODIFY_ITEM的替代方案是什么?
答案 0 :(得分:1)
RESET_SCREEN是否正确,因为它不会突变,是否正确? 国家
是的,这是正确的。
但是MODIFY_ITEM部分很糟糕,因为它会发生突变
否,MODIFY_ITEM
不会改变状态:
这一行:state.items[itemId].item = action.item;
改变了对象(不是状态),但是redux
并不关心局部对象的突变-甚至都不知道。
只要您返回一个新引用(即对象的新副本),redux
就将其视为有效的新状态。
因此,根据redux,
这是状态突变:
case MODIFY_ITEM:
let itemId = state.item.id;
state.items[itemId].item = action.item;
return state; // <-- because you are returning the same reference. BAD
这不是状态突变:
case MODIFY_ITEM:
let itemId = state.item.id;
state.items[itemId].item = action.item;
return Object.assign({}, state, {items: state.items}); // <- A new Object. GOOD
您可能想阅读有关浅层检查和状态突变here的信息。
答案 1 :(得分:0)
您正在此行中更改先前的状态
state.items[itemId].item = action.item;