当前位置:   article > 正文

axios二次封装(vue3+axios+ts+Element Plus版)_vue3+axios+element plus+ts二次封装

vue3+axios+element plus+ts二次封装

封装思想

直接使用axios,依赖性太强,今后如要换网络请求库会很麻烦

一些公共的请求功能,每次请求都需要重写配置

aixos进行加一层封装,将一些公共的功能封装,如网络请求头添加Authorization(即token),加载loading效果等等,拦截器也可以灵活封装

实现一个HttpRequest的类

utils创建utils/request.ts文件

  1. import axios, { AxiosInstance, AxiosRequestConfig, InternalAxiosRequestConfig, AxiosResponse } from "axios"
  2. import { ElLoading } from 'element-plus'
  3. interface Result<T = any> {
  4. code: number | string;
  5. msg: string;
  6. data: T;
  7. total: number;
  8. };
  9. // 导出Request类,可以用来自定义传递配置来创建实例
  10. class HttpRequest {
  11. baseURL: string;
  12. timeout: number;
  13. constructor() {
  14. this.baseURL = import.meta.env.VITE_APP_BASE_API;
  15. this.timeout = 60000
  16. }
  17. request<T = any>(options: AxiosRequestConfig): Promise<Result<T>> {
  18. // axios 实例
  19. const instance: AxiosInstance = axios.create()
  20. this.setInterceptors(instance)
  21. const opts = this.mergeOptions(options)
  22. return instance(opts)
  23. }
  24. get<T = any>(url: string, data?: any, outHeaders = {}): Promise<Result<T>> {
  25. return this.request<T>({
  26. method: 'get',
  27. url,
  28. params: { ...data }, // get参数可以直接展开
  29. headers: {}
  30. })
  31. }
  32. post<T = any>(url: string, body = {}, outHeaders = {}): Promise<Result<T>> {
  33. let data = {
  34. body,
  35. header: {}
  36. }
  37. return this.request<T>({
  38. method: 'post',
  39. url,
  40. data, // post要求必须传入data属性
  41. })
  42. }
  43. mergeOptions(options: AxiosRequestConfig) {
  44. //console.log('合并参数', options)
  45. return {
  46. baseURL: this.baseURL,
  47. timeout: this.timeout,
  48. ...options
  49. }
  50. }
  51. // 设置拦截器
  52. setInterceptors(instance: AxiosInstance) {
  53. let loading: any
  54. // 请求拦截器
  55. instance.interceptors.request.use((config) => {
  56. loading = ElLoading.service({
  57. lock: true,
  58. text: 'Loading',
  59. background: 'rgba(0, 0, 0, 0.7)',
  60. })
  61. // 一般会请求拦截里面加token,用于后端的验证
  62. /* const token = localStorage.getItem("token")
  63. config!.headers!.Authorization = token
  64. config.headers = Object.assign(config.headers, { ...config.headers, token }); */
  65. return config
  66. },
  67. (err: any) => {
  68. console.log(err);
  69. return Promise.reject(err);
  70. })
  71. // 响应拦截器
  72. instance.interceptors.response.use(
  73. (res) => {
  74. console.log("
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/82171
    推荐阅读
    相关标签