首页 > 解决方案 > Redux 中 Immer 中 Object.assign() 的意外行为

问题描述

我正在使用 redux-starter-kit (其中包括用于可变更新的 Immer 库),由于某种原因,这个减速器不起作用:

reInitializeState(state, action) {
        state = Object.assign({}, initialState);
        state.someProperty = true; // this does not get set
    },

但是这个可以:

reInitializeState(state, action) {
        Object.assign(state, initialState);
        state.someProperty = true; // this does
    },

我希望他们做同样的事情。这里发生了什么?

标签: javascriptobjectredux

解决方案


使用 Immer,您可以就地改变对象以创建下一个不可变副本。在第一个示例中,因为state作为参数进来,所以:

state = Object.assign({}, initialState);

重新分配state给一个新对象,因此someProperty对该新对象的设置不会导致任何更改——您必须对参数本身进行变异。

在第二个示例中,您不会重新分配state给其他东西,因此调用state.someProperty和修改它会修改原始状态对象。


推荐阅读