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

自动冻结功能

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

immerjs疑问

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

阅读 338
评论
    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 //不允许
      撰写回答

      登录后参与交流、获取后续更新提醒