求助:TypeError: object is not extensible错误(无法修改对象属性)
解决TypeError: Cannot add property newField, object is not extensible问题
这个错误的核心原因很明确:你从Redux store中获取的filterList.filter里的对象是**被冻结(不可扩展/修改)**的。Redux为了保证状态的不可变性,会自动冻结返回的状态对象——哪怕你用[...this.filterList.filter]做了数组的浅拷贝,数组里的每个元素还是指向原来的冻结对象,所以直接修改x.design_type会触发这个报错。
你之前尝试的方案没生效,大概率是因为那是针对普通不可扩展对象的处理,而Redux返回的是被深度冻结的对象,需要先把它转换成可修改的普通对象。
具体修复步骤
把数组浅拷贝改成深拷贝每个对象,这样每个元素都会变成独立的可修改对象:
// 替换原来的this.dynamicFilter = [...this.filterList.filter]; this.dynamicFilter = this.filterList.filter.map(item => JSON.parse(JSON.stringify(item))); // 之后再执行修改操作就不会报错了 this.dynamicFilter.forEach((x) => { if (x.design_type == 'checkbox') { x.design_type = 'sadas'; } });
其他可选方案
如果你不想用JSON.parse(JSON.stringify())(它有不能处理函数、Symbol等类型的局限性),可以用:
- 结构化克隆:
structuredClone(item)(现代浏览器支持) - Lodash的
cloneDeep方法(需要引入lodash库)
额外说明
Redux的状态不可变性是它的核心设计之一,所以永远不要直接修改从store中获取的状态对象——正确的做法就是像上面这样,先创建一个可修改的副本,再对副本进行操作。
内容的提问来源于stack exchange,提问作者cakePHP
相关产品推荐
相关产品推荐

