vue3+TS封装axios

文章讲述了如何在前端项目中封装axios,主要是为了实现跨域代理和状态管理,包括设置请求头、处理接口异常返回。通过配置axios的拦截器,可以在请求发送前设置请求头,如添加token,以及在响应返回后处理状态码,例如用户登录过期或网络错误的情况。同时,文章提到了在Vue中使用封装后的axios方法,以及定义请求体和返回体的类型来增强代码的可读性和安全性。
摘要由CSDN通过智能技术生成

首先大家封装axios的目的是什么呢?大多数都是为了前端本地开发的跨域代理,状态的集中处理(集体添加请求头,处理接口异常返回等等)

下面的这个呢就是axios的拦截器,可以分别配置请求拦截和响应拦截,请求拦截可以在发出请求前进行设置请求头的操作(比如token),响应拦截就是为了处理状态码之类的,比如用户登录过期,网络错误(主要为了提示用户)等等。配置好设置后记得把实例对象exprot出去哦。

import axios, {AxiosInstance, AxiosResponse, InternalAxiosRequestConfig} from "axios";
// import { h } from 'vue'
import router from "@/router";
const myAxios:AxiosInstance=axios.create({
    baseURL:'/ecomms-boot'
})
myAxios.interceptors.request.use((res:InternalAxiosRequestConfig):any=>{
    res.headers['X-Access-Token']=localStorage.getItem('token')||''
    return res
},  (error):object=> {
    return Promise.reject(error);
});

myAxios.interceptors.response.use( (response:AxiosResponse):any =>{
    if (response.data.code===403){
    }else if (response.data.code===505){
        router.replace('/login')
        localStorage.clear()
    }
    return response.data;
},  (error):any =>{
    return Promise.reject(error);
});
export default myAxios

 写好拦截后就要开始使用了。使用前呢,记得写好请求体跟返回体的interface或者type哦。

export interface InState{
    password:string,
    username:string
}
export type sd={
    success:boolean
    result:any,
    message:string
}

接下来就可以在调用axios的方法里使用类型进行限制了,记得引入封装好的axios,引入类型。

因为axios是通过promise封装的ajax,所以方法的返回类型是Promise类型,内部函数类型就是我们刚写好的sd了。当然记得把这个userLogin方法export出去。

import myAxios from "@/util/request/axiosRequest.ts";
import {sd} from "@/views/login/type.ts";

export function userLogin(data:{username:string,password:string}):Promise<sd>{
    return myAxios({
        method:'post',
        url:'/sys/login',
        data
    })
}

接下来就是页面调用了。传递所需要的请求体,接收接口的回调进行数据渲染。

可以看到

await userLogin({
password: state.password,
username: state.username
})

就是我们刚刚写好的方法。可以通过结构的方式进行数据分离。

export default defineComponent({
  name: "login",
  setup(){
    const users=user();
    const router=new (useRouter as any)
    const state:InState=reactive({
      password:'',
      username:''
    })
    async function login(): Promise<void> {
      localStorage.clear()
      const {success,result,message} = await userLogin({
        password: state.password,
        username: state.username
      })
      if (success) {
        localStorage.setItem('token',result.token)
        users.token=result.token as string
        router.replace('/main')
      }else{
        showDialog({
          title: '温馨提示',
          content:message,
          noCancelBtn: true,
        });
      }
    }
    return{
      state,login
    }
  }
})

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值