如何在 Redux-Toolkit + typescript 中调度组件外部的操作?

Eld*_*lov 4 reactjs redux react-redux redux-toolkit

我有轴拦截器,并且在商店中有误差减速器。如何在组件外部正确调度操作?

我尝试了 store.dispatch,我不知道为什么,但它崩溃了我的整个商店,我的整个应用程序崩溃了。我尝试了 useAppDispatch,但出现错误,无法在组件外部使用它。代码如下:

import axios from "axios";
import store from "../store/store";
import { addError } from "../store/errorSlice/errorSlice";

const instance = axios.create({
    timeout: 1000,
    withCredentials: true,
    baseURL: "http://localhost:8000"
})

instance.interceptors.response.use(response => response,
   function (error) {
        console.log("ERROR FROM SERVER");
        const { data, status } = error.response;
        const { message } = data;

        store.dispatch(addError({ message, status, active: true })) // crashes my whole app. It looks like triggering an action, but then delete all reducers
        return ;
})

export default instance;
Run Code Online (Sandbox Code Playgroud)

这是我的 ErrorSlice.ts

import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import IError from "../../models/error";

const initialState: IError = {
    message: "",
    status: 400,
    active: false
}

const ErrorSlice = createSlice({
    name: "Error",
    initialState,
    reducers: {
        addError: (_, action: PayloadAction<IError>) => action.payload,
        deleteError: (_) => {
            return { 
                message: "",
                status: 400,
                active: false } as IError   }
    }
})

export default ErrorSlice.reducer;
export const { addError, deleteError } = ErrorSlice.actions;
Run Code Online (Sandbox Code Playgroud)

mar*_*son 12

您永远不应该将存储直接导入到其他应用程序文件中,因为您可能最终会遇到循环导入依赖问题。

对于这种用例,最好的解决方案是在启动时将文件注入到 Axios 设置逻辑中,如下所示:

// axios-setup.js
let store

export const injectStore = _store => {
  store = _store
}

axiosInstance.interceptors.request.use(config => {
  config.headers.authorization = store.getState().auth.token
  return config
})

// index.js
import store from "./app/store".
import {injectStore} from "./axios-setup";
injectStore(store);
Run Code Online (Sandbox Code Playgroud)