axios封装—vue3项目

本文介绍了在Vue3项目中如何封装axios请求,包括创建axios实例,设置请求和响应拦截器,处理Loading,以及封装get和post请求。同时提供了两种使用封装后的请求的方法,一种是将接口定义在单独文件内,另一种是在项目内直接使用。此外,还涉及到了Vant的Toast组件用于展示加载状态。
摘要由CSDN通过智能技术生成


前言

axios的API很友好,可以在项目中直接使用。但是在大型项目中,http请求很多,且需要区分环境, 每个网络请求有相似需要处理的部分,会导致代码冗余,破坏工程的可维护性,扩展性,所以需要对axios请求进行相应的封装


正文

安装axios
# npm 安装
npm install axios
# yarn 安装
yarn add axios
封装请求api
1. 在src目录下新建个api目录,里面放请求相关的文件,新建request.js文件,首先引入axios
import axios from 'axios';
2. 创建一个axios实例
// request.js
// 创建新的axios实例
const service = axios.create({
  // 环境变量,需要在.env文件中配置
  baseURL: process.env.VUE_APP_BASE_API,
  // 超时时间暂定5s
  timeout: 5000,
});
3. axios请求拦截器

config里面配置请求前的一些处理,例如:数据转化,配置请求头,设置token,设置loading等,根据需求去添加

// request.js
service.interceptors.request.use(
  config => {
  	// 此处添加Loading
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

接下来加入Loading,使用了vant组件的Toast提示,所以先引入vant,其他UI库同理

# Vue 3 项目,安装最新版 Vant
npm i vant
# 通过 yarn 安装
yarn add vant
// request.js
// 使用vant组件的Toast提示,import引入要放在项目最上方
import { showToast, showLoadingToast, closeToast, setToastDefaultOptions } from 'vant';
import 'vant/es/toast/style';
//显示持续时长
setToastDefaultOptions({ duration: 3000 }); 

// loading 次数
let loadingCount = 0;

service.interceptors.request.use(
  config => {
    // 加入Loading
    showLoadingToast({
      message: '加载中...',
      //禁止背景点击
      forbidClick: true,
    });
    loadingCount++;
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);
4. axios响应拦截器
// request.js
service.interceptors.response.use(
  response => {
    // 关闭loading
    loadingCount--;
    if (loadingCount === 0) {
      closeToast();
    }
    return response;
  },
  error => {
    closeToast();
    // 处理异常情况,根据项目实际情况处理或不处理
    if (error && error.response) {
      // 根据约定的响应码处理
      switch (error.response.status) {
        case 403:
          error.message = '拒绝访问';
          break;
        case 502:
          error.message = '服务器端出错';
          break;
        default:
          error.message = `连接错误${error.response.status}`;
      }
    } else {
      // 超时处理
      error.message = '服务器响应超时,请刷新当前页';
    }
    showToast(error.message);
    return Promise.resolve(error.response);
  }
);
5. 封装请求函数,可以根据项目实际情况处理参数(此处仅处理了get与post请求)
// request.js
const Request = (url, options = {}) => {
  let method = options.method || 'get';
  let params = options.params || {};
  
  if (method === 'get' || method === 'GET') {
    return new Promise((resolve, reject) => {
      service
        .get(url, {
          params: params,
        })
        .then(res => {
          if (res && res.data) {
            resolve(res.data);
          }
        })
        .catch(err => {
          reject(err);
        });
    });
  } else {
    return new Promise((resolve, reject) => {
      service
        .post(url, params)
        .then(res => {
          if (res && res.data) {
            resolve(res.data);
          }
        })
        .catch(err => {
          reject(err);
        });
    });
  }
};
6. 最后导出函数方法
// request.js
export default Request;
使用方式
1. 可以将接口全部定义在一个文件内(方便管理)

在request.js文件同级目录内新建index.js

// index.js
import http from './request';

export function getXXX() {
  return http('/api/get');
}

export function postXXX(params) {
  return http('/api/post', {
    method: 'POST',
    params: params,
  });
}

然后在项目中引入

import { getXXX, postXXX } from "./api/index";
getXXX().then(res => {
	// ...
});
let params = {
  pageNum: 1,
  pageSize: 10,
};
postXXX(params).then(res => {
	// ...
});
2. 另一种写法是直接在项目内使用
import http from "./api/request";

http('/api/get').then(res => {
	// ...
});

let params = {
  pageNum: 1,
  pageSize: 10,
};
http('/api/post', {
  method: 'POST',
  params: params,
}).then(res => {
	// ...
});;

总结

本文通过vue3+vant4的项目例子介绍了如何在项目里封装axios请求,其实vue2里面写法也类似,axios封装没有一个绝对的标准,需要结合项目中实际场景来设计。

如果此篇文章对您有帮助欢迎您【点赞】,也欢迎您【评论】+【收藏】!


扩展阅读

  1. Axios中文文档
  2. Vant4 Toast
axios 是一款流行的 JavaScript 库,用于浏览器和 Node.js 环境中的 HTTP 请求。在 Vue 3 中,它常被用于处理 API 调用,简化数据交互。为了更好地管理和复用 axios,可以对其进行封装,以便在整个项目中统一使用。 以下是一个简单的 Axios 封装示例: ```javascript // 创建一个 Vue.prototype 的属性 axios import axios from 'axios'; Vue.prototype.$http = { install(Vue) { Vue.prototype.$axios = axios.create({ // 设置默认配置,如 base URL、请求头等 baseURL: process.env.BASE_URL, headers: { 'Content-Type': 'application/json' }, timeout: 5000, // 超时时间 withCredentials: true, // 是否发送 cookie }); // 拦截器设置:发送前和发送后 axios.interceptors.request.use((config) => { // 添加全局的请求拦截器 return config; }, (error) => { // 发送错误处理 console.error('请求失败', error); Promise.reject(error); }); axios.interceptors.response.use((response) => { // 处理成功响应 return response.data; }, (error) => { // 处理错误响应 console.error('请求错误', error.message); if (error.response.status) { switch (error.response.status) { case 401: // 处理未授权 break; default: // 其他错误处理 break; } } else { // 如果没有状态码,可能是网络问题 console.error('未知错误', error.message); } return Promise.reject(error); }); }, }; ``` 要在组件中使用封装axios,只需注入 `$http` 或者 `$axios`,例如: ```html <template> <div> <button @click="fetchData">获取数据</button> </div> </template> <script setup> import { onMounted } from 'vue'; import { $http } from '@/common/api'; async function fetchData() { try { const response = await $http.get('/api/data'); console.log(response); } catch (error) { console.error(error); } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值