我有一个基于向导的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;
}
});
};
答案 0 :(得分:0)
有关我的问题的答案,请参见上面的更新