Redux Toolkit中createAsyncThunk搭配axios实例无法正常运行问题求助
问题原因
核心是循环依赖导致userReducer在store初始化时未正确导出,所以combineReducers识别不到user字段对应的reducer:
- store.ts 导入 userSlice 导出的 userReducer 用于组装根reducer
- userSlice.ts 导入 api.ts 中的 signIn、signUp 方法
- api.ts 导入 ApiClient 实例
- 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
相关产品推荐
相关产品推荐

