首页 > 解决方案 > Redux Toolkit:'无法在已撤销的代理上执行'set''

问题描述

我正在尝试使用 React 重新创建类似记忆的游戏。我正在使用 Redux Toolkit 进行状态管理,但我遇到了一个用例的问题。

在 selectCard 操作中,我想将选定的卡片添加到商店,并检查是否已经选择了其中的 2 张。如果是这样,我想selected在延迟后清空数组。

const initialState : MemoryState = {
    cards: [],
    selected: [],
}

const memorySlice = createSlice({
    name: 'memory',
    initialState: initialState,
    reducers: {        
        selectCard(state: MemoryState, action: PayloadAction<number>) {
            state.selected.push(action.payload);
            if (state.selected.length === 2) {
                setTimeout(() => {
                    state.selected = [];
                }, 1000);
            }
        }
    }
});

卡片选择得很好,但是当我选择 2 时,我在 1 秒后收到此错误:

TypeError: Cannot perform 'set' on a proxy that has been revoked, 在线上state.selected = [];

我是这个东西的新手,延迟后如何访问状态?我必须异步执行吗?如果是这样,怎么做?

标签: reactjsreduxredux-toolkit

解决方案


他们的文档中所述,不要在减速器内执行副作用。

我会在调度操作时添加 setTimeout :

// so the reducer:
...
if (state.selected.length === 2) {
  state.selected = [];
}
...

// and when dispatching
setTimeout(() => {
  dispatch(selectCard(1))
}, 1000)

推荐阅读