You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用createAsyncThunk删除Todo状态项失效,请求技术排查

问题排查与解决:Redux Toolkit异步删除Todo不生效

问题原因

1. 异步操作时序错误

deleteTodo是通过createAsyncThunk创建的异步action,内部包含await wait(1000)的延迟逻辑。你在调用store.dispatch(deleteTodo(1))后立刻执行console.log(store.getState().todoReducer),此时异步任务还未完成,deleteTodo.fulfilled对应的reducer还没有触发,状态自然没有更新。

2. Reducer写法可优化(非核心原因)

虽然返回新数组的写法在RTK中是允许的,但RTK基于Immer实现,推荐使用可变更新语法修改状态,更符合工具库的设计习惯,也能避免潜在的状态更新问题。

解决方法

方法一:等待异步任务完成后打印状态

修改index.ts代码,使用async/await等待异步dispatch完成:

import { store } from "./slices";
import { Todo } from "./Todo";
import { deleteTodo } from "./slices";

const todo1: Todo = { id: 1, title: "Do homework", completed: true }
const todo2: Todo = { id: 2, title: "Wake up", completed: true }

store.dispatch({ type: 'todo/addTodo', payload: todo1 })
store.dispatch({ type: 'todo/addTodo', payload: todo2 })

// 等待异步删除完成后打印最新状态
(async () => {
  await store.dispatch(deleteTodo(1));
  console.log(store.getState().todoReducer);
})();

方法二:通过订阅监听状态变化

使用store.subscribe监听状态更新,确保状态变化后再输出:

import { store } from "./slices";
import { Todo } from "./Todo";
import { deleteTodo } from "./slices";

const todo1: Todo = { id: 1, title: "Do homework", completed: true }
const todo2: Todo = { id: 2, title: "Wake up", completed: true }

store.dispatch({ type: 'todo/addTodo', payload: todo1 })
store.dispatch({ type: 'todo/addTodo', payload: todo2 })
store.dispatch(deleteTodo(1))

// 订阅状态变化,每次更新后打印最新状态
store.subscribe(() => {
  console.log(store.getState().todoReducer);
});

优化Reducer写法(可选)

修改slices.ts中extraReducers的逻辑,使用Immer的可变更新方式:

extraReducers: (builder) => {
  builder.addCase(deleteTodo.fulfilled, (state, action) => {
    const targetIndex = state.findIndex(todo => todo.id === action.payload);
    if (targetIndex !== -1) {
      state.splice(targetIndex, 1);
    }
  })
}

内容的提问来源于stack exchange,提问作者Hoàng Trung Nam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:20:28