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

Redux Toolkit中createAsyncThunk搭配axios实例无法正常运行问题求助

问题原因

核心是循环依赖导致userReducer在store初始化时未正确导出,所以combineReducers识别不到user字段对应的reducer:

  1. store.ts 导入 userSlice 导出的 userReducer 用于组装根reducer
  2. userSlice.ts 导入 api.ts 中的 signIn、signUp 方法
  3. api.ts 导入 ApiClient 实例
  4. ApiClient.ts 顶层直接导入还未初始化完成的 store.ts,导致模块加载卡死,userReducer 最终导出为 undefined

你备注里移除API引用后报错消失,刚好验证了这个逻辑:移除API引用就切断了循环依赖链,模块可以正常加载。


修复方案

前置检查项

先确认导出导入语法匹配:
userSlice.ts 中默认导出reducer:export default userSlice.reducer,如果 store.ts 中是命名导入import { userReducer } from './user',也会导致userReducer为undefined,需要两边统一:

  • 方案A:修改store.ts导入为 import userReducer from './user'
  • 方案B:修改userSlice.ts导出为 export const userReducer = userSlice.reducer

核心修复:修改ApiClient的store引用为惰性加载

不要在ApiClient模块顶层导入store,改为在请求拦截器运行时动态获取,这时候store已经完成初始化,不会触发循环依赖:

// ApiClient.ts 修改如下
import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';
// 删掉顶部的 import { store } from '../store/store' 语句
const baseUrl = 'https://************/api';// 合法url

class ApiClient {
  private api: AxiosInstance;

  constructor() {
    this.api = axios.create({
      baseURL: baseUrl,
      headers: {
        'Content-Type': 'application/json',
      },
    });

    this.api.interceptors.request.use((config) => {
      // 运行时动态导入store,此时store已初始化完成
      const { store } = require('../store/store');
      const token = store.getState().user.accessToken;
      if (token !== null) {
        config.headers.Authorization = `Bearer ${token}`;
      }
      return config;
    });
  }

  post(url: string, { data }: AxiosRequestConfig) {
    return this.api.post(url, data);
  }

  get(url: string) {
    return this.api.get(url);
  }

  put(url: string, { data }: AxiosRequestConfig) {
    return this.api.put(url, data);
  }

  delete(url: string) {
    return this.api.delete(url);
  }
}

export default new ApiClient();

额外优化:修正userSlice的状态更新逻辑

你当前signIn成功后的返回逻辑会破坏state的原有结构,导致后续拿token、用户信息报错,建议修改为immer的直接修改写法,避免丢失字段:

// userSlice.ts 中signInRequest.fulfilled的回调修改为:
builder.addCase(signInRequest.fulfilled, (state, action) => {
  const { user, accessToken } = action.payload;
  state.status = 'success';
  state.accessToken = accessToken;
  state.user = user;
  // 不需要return,immer会自动生成新的state
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:57:03