javascript 角应力:TypeError:无法冻结包含元素的数组缓冲区视图

xvw2m8pv  于 2023-02-15  发布在  Java
关注(0)|答案(4)|浏览(117)

我遇到了一个ngrx的问题。我有一个数组在我的状态,我想追加对象。这实际上工作正常,如果我console.log他们,我可以看到我的存储中的值。但redux开发工具和控制台抛出错误"TypeError:无法冻结具有元素""的数组缓冲区视图。
我有一个如下所示的状态:

const state: State = {
  array: []
};

我传递给我的动作的Object看起来类似于:

const obj = {attr: number, data: ImageData};

其中,ImageData来自Canvas,并使用canvas.getContext("2d").getImageData(...);提取。应该注意的是,该对象非常庞大,有超过69000个键,值从0到255(RGBA)。
然后我将新对象附加到状态/存储区,如下所示:

createReducer(
  initialState,
  on(action, (state: State, action)=> {
    return {
      ...state,
      array: [...state.array, action.payload]
    }
  })
);

此外,我读到在将对象传递给操作之前应该进行deepCopy,所以我使用了lodash copyDeep(),但得到了相同的结果。
任何帮助都很感激。

fafcakar

fafcakar1#

你需要在你的reducer中加入状态数组。

return {
  ...state,
  array: [...state.array, action.payload]
}
42fyovps

42fyovps2#

我遇到了同样的问题,我通过克隆传递给调度方法的数据来解决它
例如:

const dataCloned = CloneDataInDeep.clone(dataToAdd);
this.store$.dispatch(actionToDispatch({ dataCloned}));

我尝试过的另一个选项是将ngrx配置中的属性值"strictActionImmutability"从true更改为false

runtimeChecks: {
  strictActionImmutability: false,
  ....
}
e37o9pze

e37o9pze3#

我使用Angular ,遇到了该错误。
对我来说,在调度工作之前深度复制数组

const copyArray = JSON.parse(JSON.stringify(array));
this.store.dispatch(actionDispatch.requestSth({ myArray: copyArray }));

我知道这不是最好的解决办法。
编辑:不幸的是,这个解决方案没有什么帮助,因为数组中的对象在被strigified时会失去功能......所以回到原点

ryevplcw

ryevplcw4#

您可以使用此代码。这将复制整个对象,以便删除依赖项。

const newlyCreatedArray = Object.assign({}, array);

有关详细信息:Object.assign()

相关问题