为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕神8447489 2021-06-08 17:45:42
我正在使用 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    },我希望他们做同样的事情。这里发生了什么?
查看完整描述

3 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

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

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

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

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


查看完整回答
反对 回复 2021-06-24
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

你在这里做什么:

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

正在复制initialState到一个新对象中,并丢弃state. 您应该分配给statenot {},并将结果分配给state

state = Object.assign(state, initialState);


查看完整回答
反对 回复 2021-06-24
?
临摹微笑

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,该对象在脚本的其他地方无法看到,并继续进行垃圾收集。


查看完整回答
反对 回复 2021-06-24
  • 3 回答
  • 0 关注
  • 196 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信