immer.js自动冻结功能是全部冻结对象还是只冻结修改的部分

自动冻结功能

文档上的一些说法
Immer 还在内部做了一件很巧妙的事情,那就是通过 produce 生成的 nextState 是被冻结(freeze)的,(Immer 内部使用Object.freeze方法,只冻结 nextState 跟 currentState 相比修改的部分),这样,当直接修改 nextState 时,将会报错。 这使得 nextState 成为了真正的不可变数据。

immerjs疑问

“只冻结 nextState 跟 currentState 相比修改的部分),这样,当直接修改 nextState 时,将会报错” 这句话是修改 nextState与currentState 相比修改的部分 将会报错的意思吗?
那我给nextState新增一个属性为什么不行,或者是修改没有修改的部分还是报错

阅读 3k
1 个回答

这里面指的部分冻结,是指只会冻结 currentState 里面在 produce 里被使用的部分,但是没说 nextState 没被冻结,实际上 nextState 是被完全冻结的。

var  origin1  =  {
    a:  {
        value:  'no',
    },
    b:  {
        value:  'no',
    },
}

var  im1  =  produce(origin1,  origin1  =>  {
    origin1.a.value  =  'im1'
})

origin1.b.value =  'yes'  //允许

im1.c  =  true //不允许
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏