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

Redux Toolkit如何在prepare回调内访问slice状态生成todo ID

问题解答

核心结论

Redux Toolkit的prepare回调无法直接访问当前slice的状态——你的代码里给prepare函数添加state参数是错误的,prepare的参数仅包含你调用dispatch时传入的值(比如这里的text),它在action创建阶段执行,此时还未进入reducer流程,无法获取当前store的状态。

解决方案:在reducer中生成ID

既然你希望ID基于当前todos数组的长度、且对dispatch调用者完全透明,最直接的方案是把生成ID的逻辑移到reducer中执行——因为reducer可以直接访问当前的state。

修改后的代码如下:

const initialState = {
  todos: [],
  maxTodos: 5
  // 其他状态字段...
};

const todoSlice = createSlice({
  name: 'todos',
  initialState,
  reducers: {
    addTodo: {
      reducer: (state, action) => {
        // 在reducer中基于当前todos长度生成ID
        const newTodo = {
          id: state.todos.length,
          text: action.payload
        };
        state.todos.push(newTodo);
        // 或者用不可变写法:return { ...state, todos: [...state.todos, newTodo] }
      },
      prepare: (text) => {
        // 仅接收dispatch传入的文本内容,无需处理ID
        return { payload: text };
      },
    },
    // 其他reducer逻辑...
  }
});

// 调用时只需传文本,ID完全透明
dispatch(addTodo("要添加的待办内容"));

补充说明

这种方案完全符合你的需求:

  • 调用dispatch时只需传递待办内容,ID生成逻辑对调用者隐藏
  • ID基于当前todos数组的长度生成,满足你“通过数组位置控制todo”的要求
  • 不需要额外引入nanoid或从外部传递长度参数

内容的提问来源于stack exchange,提问作者Yaron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:53:14