reactjs - 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 = [];
我是这个东西的新手,延迟后如何访问状态?我必须异步执行吗?如果是这样,怎么做?
解决方案
如他们的文档中所述,不要在减速器内执行副作用。
我会在调度操作时添加 setTimeout :
// so the reducer:
...
if (state.selected.length === 2) {
state.selected = [];
}
...
// and when dispatching
setTimeout(() => {
dispatch(selectCard(1))
}, 1000)
推荐阅读
- python - 如何在python中将两个嵌套字典与相同的键组合(附加值)?
- c# - 如何为 C#/.net 制作 Unity 风格的事件管理器?
- python - 在 docker 中运行 django/postgres 项目时出现“连接被拒绝”
- php - PHP POST方法表单重定向在操作页面上
- c# - A* 寻路在 3D Minecraft 环境中不起作用
- javascript - 每次单击按钮时如何更改价格值?
- gnuplot - 为什么点与 Gnuplot 的链接不好?
- angular - 这个 originalEvent 来自使用 Angular 2+ 中的 EventEmitter
- android-studio - 生成签名的 APK:构建 APK 时出错
- reactjs - 变量不适用于createContext,我应该如何通过状态传递它