Redux 中 Immer 中 Object.assign() 的意外行为

Mar*_*son 5 javascript object redux

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

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

但这个确实:

reInitializeState(state, action) {
        Object.assign(state, initialState);
        state.someProperty = true; // this does
    },
Run Code Online (Sandbox Code Playgroud)

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

jac*_*rms 5

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

state = Object.assign({}, initialState);
Run Code Online (Sandbox Code Playgroud)

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

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