Redux reducer-它会改变状态吗?

时间:2019-03-12 07:46:20

标签: reactjs redux react-redux

我遇到了以下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的替代方案是什么?

2 个答案:

答案 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;