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

如何获取createAsyncThunk结合createSlice生成的Action用于监听中间件?

获取authSlice对应的Action方法

1. createSlice自带reducers生成的Action

这部分和你之前的用法完全一致,直接从authSlice.actions中提取即可。比如你定义的setUser、removeUser,直接用authSlice.actions.setUser、authSlice.actions.removeUser就能拿到对应的Action Creator,不需要做任何额外修改。

2. createAsyncThunk生成的Action

createAsyncThunk本身会自动生成三个关联的Action Creator,分别对应异步操作的三种状态:pending、fulfilled、rejected,这些不需要从slice里获取,直接通过你定义的thunk变量本身的属性调用即可。

举个实际代码例子:

// 先定义logout异步thunk
const logout = createAsyncThunk('auth/logout', async () => {
  // 这里写你的logout异步逻辑,比如调用后端接口
});

// 再创建authSlice
const authSlice = createSlice({
  name: 'auth',
  initialState: { user: null },
  reducers: {
    setUser: (state, action) => { state.user = action.payload },
    removeUser: (state) => { state.user = null }
  },
  extraReducers: (builder) => {
    builder.addCase(logout.fulfilled, (state) => {
      state.user = null;
    });
  }
});

在createListenerMiddleware中使用时,直接传入logout.fulfilled这类Action Creator即可:

const listenerMiddleware = createListenerMiddleware();

listenerMiddleware.startListening({
  actionCreator: logout.fulfilled, // 直接用thunk的fulfilled状态Action
  effect: async (action, listenerApi) => {
    // 这里写你要触发的逻辑,比如清除本地存储、跳转登录页等
    localStorage.removeItem('token');
    window.location.href = '/login';
  }
});

可选:统一管理所有Action(非必需)

如果你习惯从同一个入口获取所有Action,可以把thunk生成的Action补充到authSlice.actions中:

authSlice.actions.logoutPending = logout.pending;
authSlice.actions.logoutFulfilled = logout.fulfilled;
authSlice.actions.logoutRejected = logout.rejected;

// 之后就可以用authSlice.actions.logoutFulfilled来调用了

不过这种方式不是官方推荐的,直接使用thunk变量的属性更符合Redux Toolkit的设计规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:45:34