react18封装公共请求函数

如果里面要处理比如token过期,跳转登录这种情况的话,官方又说组件外不允许使用Hooks函数,这里可以这样做

  • 使用redux 并新建一个store/index.ts
import { configureStore, combineReducers } from '@reduxjs/toolkit'
import counterRouter from './modules/router'
import counterSlice from './modules/counterSlice'
import getDataConfig from './modules/getDataConfig'
import { persistStore, persistReducer } from 'redux-persist'
// 选择持久化存储引擎,如 localStorage 或 AsyncStorage
import storage from 'redux-persist/lib/storage' // 默认使用localStorage作为存储引擎
 
// 组合各个模块的reducer
const reducer = combineReducers({
  counter: counterRouter,
  contText:counterSlice,
  getDataConfig:getDataConfig
})
 
// 配置持久化设置
const persistConfig = {
  key: 'root', // 存储的键名
  storage, // 持久化存储引擎
  // 可选的配置项,如白名单、黑名单等 选其一就好了
  blacklist:['contText'], // 只有 test 不会被缓存
  // whitelist: ["test"], // 只有 test 会被缓存
}
 
const persistedReducer = persistReducer(persistConfig, reducer)
 
export const storeData = configureStore({
  reducer: persistedReducer, // 注册子模块
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({
      serializableCheck: false // 关闭默认的序列化检查//关闭严格模式
    })
})
 

//获取store中的所有reducer的数据类型并导出
export type RootState = ReturnType<typeof storeData.getState>
//提取dispatch数据类型
export type AppDispatch = typeof storeData.dispatch;

export const persistor = persistStore(storeData)
这样的话,其他地方你就可以直接引入store文件,然后使用里面的方法或者获取store数据,不用在使用hooks函数

如果要跳转路由的话,可以这样window.location.href = “/login”;

新建request.ts 

//1.引入vue
// import Vue from 'vue'
//2.引入axios库
import axiosNew from 'axios';
import config from '@/config/index'//引入公用文件
import { useNavigate } from 'react-router-dom';
import { useDispatch, useSelector } from 'react-redux';
import { AppDispatch, RootState } from '@/store';
import { setToken } from '@/store/modules/getDataConfig';
// 引入 pinia  token
import {storeData} from "@/store"
import { increment } from '@/store/modules/router';

// 引入接口地址

axiosNew.defaults.timeout =3000;//请求超时时间


axiosNew.interceptors.request.use(//请求拦截

    (config:any) => {
        // const useUserData=loginStore.tokenStore();
        config.headers['content-type'] = 'application/x-www-form-urlencoded';
        // console.log(config.headers,"请求头----",useSelector)
       
        // if (userToken) {//如果有token给请求头加上
        //     config.headers['authorization'] =userToken
        // }
       
        return config
    },

    err => {
        return Promise.reject(err);
    }

)
// let router=useRouter();

// 获取登录TOKEN信息


axiosNew.interceptors.response.use(response => {//相应拦截
  
    try{
        
        
        
    }catch(err){
        // console.log("在相应拦截这边其他请求不需要取token",err)
    };
  
    if(response.data.code==10001||response.data.code==402){//如果token为空或者过期,跳到登录
        // const dispatch: AppDispatch = useDispatch()
        // 清空token
        // dispatch(setToken(""))
        // 跳转登录
       
       
    }
    return response;
}
    ,err=>{
        return Promise.reject(err)
    }
);
function getTOken(){
        
}
// axiosNew.defaults.baseURL=""
const axios=function(path:string,method:string,data:any){
    // const routerStroe=useSelector((state:RootState) => state.getDataConfig)
   
    var header:any;
    // 如果存在token就放进去
    header=config.headers

    return new Promise((resolve,reject)=>{
        let datas:any={params:{...data}}
        // let b=qs.parse(datas)
       
        if(method==="POST"||method=="post") datas={...{data}};
        // console.log(qs.stringify(data),"参数---",b)
        axiosNew({
            url:`${config.url}/xys/api/${path}`,
            method,
            header: header,
            ...datas
        }).then(res=>{
            if(res.data.code == 0){
                resolve(res.data.data)
            }else if([410000, 410001, 410002, 10032].indexOf(res.data.code) !== -1){
                // 登录过期跳转登录页
                window.location.href = "/login";
                //    清空
                storeData.dispatch(setToken(""))
                
            }
            
            else{
                resolve(-1)
                // ElMessage.error(res.data.message)
            }
            
        }).catch(err=>{
            storeData.dispatch(setToken(""))
            // const navigate=useNavigate()

            // navigate("/login")
            // window.location.href = "/login";
            resolve(-1)
            // ElMessage.error('请求失败,请稍后再试...')
        })
    })
};
const request:any = {};

['options', 'get', 'post', 'put', 'head', 'delete', 'trace', 'connect'].forEach((method) => {
	request[method] = (api: any, data: any, opt: any) => axios(api, method, data)
});
export default request




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初遇你时动了情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值