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
相关产品推荐
相关产品推荐

