3 回答

TA贡献1827条经验 获得超9个赞
使用 Immer,您可以就地改变对象以创建下一个不可变副本。在第一个示例中,因为state
作为参数传入,执行:
state = Object.assign({}, initialState);
重新分配state
给一个新对象,因此someProperty
在该新对象上的设置不会导致任何更改——您必须对参数本身进行变异。
在第二个示例中,您不会重新分配state
给其他东西,因此调用state.someProperty
和修改它会修改原始状态对象。

TA贡献1801条经验 获得超8个赞
你在这里做什么:
state = Object.assign({}, initialState);
正在复制initialState
到一个新对象中,并丢弃state
. 您应该分配给state
not {}
,并将结果分配给state
。
state = Object.assign(state, initialState);

TA贡献1982条经验 获得超2个赞
重新分配变量本身几乎不会对其他地方产生任何影响。如果您将变量作为参数传递,然后重新分配该变量,然后函数结束,函数之外的任何内容都不会看到任何更改。相似地:
let someVar = 'foo';
function reassign(str) {
str = 'bar';
}
reassign(someVar);
console.log(someVar);
在上面的函数内部重新分配不会做任何事情,因为重新分配不会改变someVar指向的外部绑定。
你的第二个片段:
reInitializeState(state, action) {
Object.assign(state, initialState);
state.someProperty = true; // this does
},
在这里,您正在改变state作为参数传递的原始对象,因此可以在函数外部看到更改。在另一个片段中,您正在改变一个全新的 object,该对象在脚本的其他地方无法看到,并继续进行垃圾收集。
添加回答
举报