在沉浸式制作器内部创建状态的深层副本的最佳方法是什么

时间:2019-07-31 00:14:34

标签: reactjs redux deep-copy immer.js

我有一个基于向导的GUI,在其中我需要在我的redux存储中创建一些原始状态的副本,并将其保存到名为stageEdits的新属性中,该属性可用作进行更改的临时位置,然后保存回原始状态,或丢弃...

我的第一个尝试是使用沉浸式和嵌套生产函数,如下所示:

const reducer = (state, action) => {
  return produce(state, (draftState) => {
    switch (action.type) {
      case ActionName.EditStage:
        const stage = findStageById(draftState, action.stageId);
        draftState.stageEdits = produce(stage, (draftStage) => {
          draftStage.isEditing = true;
        }
        break;
    }
  });
};

但是,这导致TypeError: Cannot perform 'get' on a proxy that has been revoked在尝试使用嵌套的生产方函数时似乎是一个问题...因此我不确定这是否是解决此问题的正确方法...

我应该使用loDash cloneDeep之类的东西,还是有更好的方法呢?

更新 这个问题专门关于如何在Immer产生函数中创建状态的deepCopy ...现在,当我尝试对Immer返回的draftState代理对象使用cloneDeep时,将返回数组中的任何内容一个数字而不是数组本身的副本...

基于@azundo提供的链接,我最终克隆了originalState而不是draftState ...这解决了我的问题...例如,请参见下面的修订代码:

import cloneDeep from 'lodash/cloneDeep';

const reducer = (currentState, action) => {
  return produce(currentState, (draftState) => {
    switch (action.type) {
      case ActionName.EditStage:
        const stage = findStageById(currentState, action.stageId);
        draftState.stageEdits = cloneDeep(stage);
        break;
    }
  });
};

1 个答案:

答案 0 :(得分:0)

有关我的问题的答案,请参见上面的更新