- 先说明问题的表象,我的对象为pagination={withPaging:true}。因为对象的withPaging属性,为只读属性,所以当我pagination.withPaging=false的时候,报以上错误。pagination为redux数据里面的一个对象。
-
为什么会为只读属性?我新建的对象或者从后台数据读取到的对象,肯定都是正常的对象,为什么这里却这样。我遇到的是从一个地方复制过去的,复制的原型没有问题,这里却有问题了。
参考下图,新建的对象configurable: true、writable: true。通过Object.freeze(obj)后,configurable: false、writable: false
image.png - 初步认为是哪里使用了Object.freeze导致的,全局搜了一下,发现react 使用数据的时候用了immer,可以参考这篇文章的介绍。 immer在复制数据的时候默认会自动冻结数据导致的。因为我的项目是多页面的,A页面全局下设置了setAutoFreeze(false),而此处功能从A页面复制到了B页面,B页面没有设置这个选项,所以B页面中用的到redux数据如果修改了的话都是被冻结的,再赋值是不允许的。就报错了
- 关于如何解决?
两种修改方式: 1.在B页面中也设置setAutoFreeze(false)。 2.此处不直接修改,拷贝一份在修改。可以用immer的方式拷贝。
个人觉得:应该拷贝一份。immer既然做了那样的限制,然后我们的规范是尽量不改传入的prop,那么按照规范,这里也不应该直接赋值修改。
网友评论