Vue2 中封装 Axios 的详细指南

打印 上一主题 下一主题

主题 942|帖子 942|积分 2826

在现代的前端开发中,与后端进行数据交互是必不可少的。Axios 是一个基于 Promise 的 HTTP 客户端,广泛用于欣赏器和 Node.js 情况中。在 Vue.js 项目中,Axios 通常用于发送 HTTP 请求。为了提高代码的可维护性和复用性,我们通常会对 Axios 进行封装。本文将详细先容如何在 Vue2 项目中封装 Axios。
1. 安装 Axios

起首,我们需要在项目中安装 Axios。假如你还没有安装 Axios,可以通过 npm 或 yarn 进行安装:
  1. npm install axios
复制代码
大概
  1. yarn add axios
复制代码
2. 创建 Axios 实例

在 Vue 项目中,我们通常会在 src 目录下创建一个 api 文件夹,用于存放与 API 干系的代码。在这个文件夹中,我们可以创建一个 axios.js 文件,用于设置 Axios 实例。
  1. // src/api/axios.js
  2. import axios from 'axios';
  3. // 创建 Axios 实例
  4. const service = axios.create({
  5.   baseURL: process.env.VUE_APP_BASE_API, // 设置 API 的基础 URL
  6.   timeout: 5000, // 请求超时时间
  7. });
  8. // 请求拦截器
  9. service.interceptors.request.use(
  10.   config => {
  11.     // 在发送请求之前做些什么
  12.     // 例如:添加 token
  13.     const token = localStorage.getItem('token');
  14.     if (token) {
  15.       config.headers['Authorization'] = `Bearer ${token}`;
  16.     }
  17.     return config;
  18.   },
  19.   error => {
  20.     // 对请求错误做些什么
  21.     return Promise.reject(error);
  22.   }
  23. );
  24. // 响应拦截器
  25. service.interceptors.response.use(
  26.   response => {
  27.     // 对响应数据做些什么
  28.     return response.data;
  29.   },
  30.   error => {
  31.     // 对响应错误做些什么
  32.     if (error.response) {
  33.       // 根据不同的状态码进行不同的处理
  34.       switch (error.response.status) {
  35.         case 401:
  36.           // 未授权,跳转到登录页面
  37.           router.push('/login');
  38.           break;
  39.         case 404:
  40.           // 资源未找到
  41.           console.error('请求的资源不存在');
  42.           break;
  43.         default:
  44.           console.error('请求失败', error.response.data);
  45.       }
  46.     } else if (error.request) {
  47.       // 请求已发出,但没有收到响应
  48.       console.error('请求超时或网络错误', error.request);
  49.     } else {
  50.       // 其他错误
  51.       console.error('请求配置错误', error.message);
  52.     }
  53.     return Promise.reject(error);
  54.   }
  55. );
  56. export default service;
复制代码
2.1 设置底子 URL

在 axios.create 方法中,我们设置了 baseURL,这是所有请求的底子 URL。通常,我们会将这个值放在项目标 .env 文件中,以便在不同的情况中使用不同的 API 地址。
  1. # .env.development
  2. VUE_APP_BASE_API=http://localhost:3000/api
  3. # .env.production
  4. VUE_APP_BASE_API=https://api.example.com/api
复制代码
2.2 请求拦截器

请求拦截器允许我们在请求发送之前对请求进行一些处置惩罚。例如,我们可以在请求头中添加 Authorization 字段,以便在请求中携带 token。
2.3 相应拦截器

相应拦截器允许我们在汲取到相应之后对相应进行一些处置惩罚。例如,我们可以直接返回相应的 data 字段,而不是整个相应对象。此外,我们还可以根据不同的状态码进行不同的处置惩罚,例如在未授权时跳转到登录页面。
3. 封装 API 请求

在 api 文件夹中,我们可以创建一个 user.js 文件,用于封装与用户干系的 API 请求。
  1. // src/api/user.js
  2. import service from './axios';
  3. // 获取用户信息
  4. export function getUserInfo(userId) {
  5.   return service.get(`/users/${userId}`);
  6. }
  7. // 更新用户信息
  8. export function updateUserInfo(userId, data) {
  9.   return service.put(`/users/${userId}`, data);
  10. }
  11. // 删除用户
  12. export function deleteUser(userId) {
  13.   return service.delete(`/users/${userId}`);
  14. }
复制代码
在这个文件中,我们封装了三个与用户干系的 API 请求:获取用户信息、更新用户信息和删除用户。每个函数都返回一个 Promise,因此我们可以在 Vue 组件中使用 async/await 来处置惩罚这些请求。
4. 在 Vue 组件中使用封装的 API

现在,我们可以在 Vue 组件中使用封装的 API 请求了。例如,在一个用户详情页面中,我们可以使用 getUserInfo 函数来获取用户信息。
  1. <template>
  2.   <div>
  3.     <h1>用户详情</h1>
  4.     <p>用户名: {{ user.name }}</p>
  5.     <p>邮箱: {{ user.email }}</p>
  6.     <button @click="updateUser">更新用户信息</button>
  7.     <button @click="deleteUser">删除用户</button>
  8.   </div>
  9. </template>
  10. <script>
  11. import { getUserInfo, updateUserInfo, deleteUser } from '@/api/user';
  12. export default {
  13.   data() {
  14.     return {
  15.       user: {},
  16.     };
  17.   },
  18.   async created() {
  19.     // 获取用户信息
  20.     const userId = this.$route.params.id;
  21.     this.user = await getUserInfo(userId);
  22.   },
  23.   methods: {
  24.     async updateUser() {
  25.       const userId = this.$route.params.id;
  26.       const updatedData = {
  27.         name: 'New Name',
  28.         email: 'newemail@example.com',
  29.       };
  30.       await updateUserInfo(userId, updatedData);
  31.       this.user = await getUserInfo(userId);
  32.     },
  33.     async deleteUser() {
  34.       const userId = this.$route.params.id;
  35.       await deleteUser(userId);
  36.       this.$router.push('/users');
  37.     },
  38.   },
  39. };
  40. </script>
复制代码
在这个组件中,我们在 created 生命周期钩子中调用 getUserInfo 函数来获取用户信息,并在 updateUser 和 deleteUser 方法中分别调用 updateUserInfo 和 deleteUser 函数来更新和删除用户。
5. 处置惩罚全局错误

在实际项目中,我们可能需要在全局范围内处置惩罚某些错误,例如网络错误或服务器错误。我们可以在 Vue 实例中添加一个全局的错误处置惩罚函数。
  1. // src/main.js
  2. import Vue from 'vue';
  3. import App from './App.vue';
  4. import router from './router';
  5. import store from './store';
  6. import service from './api/axios';
  7. Vue.config.productionTip = false;
  8. // 全局错误处理
  9. Vue.prototype.$handleError = function (error) {
  10.   if (error.response) {
  11.     // 根据不同的状态码进行不同的处理
  12.     switch (error.response.status) {
  13.       case 401:
  14.         // 未授权,跳转到登录页面
  15.         router.push('/login');
  16.         break;
  17.       case 404:
  18.         // 资源未找到
  19.         console.error('请求的资源不存在');
  20.         break;
  21.       default:
  22.         console.error('请求失败', error.response.data);
  23.     }
  24.   } else if (error.request) {
  25.     // 请求已发出,但没有收到响应
  26.     console.error('请求超时或网络错误', error.request);
  27.   } else {
  28.     // 其他错误
  29.     console.error('请求配置错误', error.message);
  30.   }
  31. };
  32. new Vue({
  33.   router,
  34.   store,
  35.   render: h => h(App),
  36. }).$mount('#app');
复制代码
然后,我们可以在组件中使用 $handleError 方法来处置惩罚错误。
  1. methods: {
  2.   async updateUser() {
  3.     const userId = this.$route.params.id;
  4.     const updatedData = {
  5.       name: 'New Name',
  6.       email: 'newemail@example.com',
  7.     };
  8.     try {
  9.       await updateUserInfo(userId, updatedData);
  10.       this.user = await getUserInfo(userId);
  11.     } catch (error) {
  12.       this.$handleError(error);
  13.     }
  14.   },
  15.   async deleteUser() {
  16.     const userId = this.$route.params.id;
  17.     try {
  18.       await deleteUser(userId);
  19.       this.$router.push('/users');
  20.     } catch (error) {
  21.       this.$handleError(error);
  22.     }
  23.   },
  24. },
复制代码
6. 总结

通过封装 Axios,我们可以在 Vue2 项目中更好地管理 API 请求,提高代码的可维护性和复用性。我们创建了一个 Axios 实例,并设置了请求和相应拦截器,以便在请求发送和相应汲取时进行一些处置惩罚。然后,我们封装了与用户干系的 API 请求,并在 Vue 组件中使用这些封装的 API。最后,我们还添加了一个全局错误处置惩罚函数,以便在全局范围内处置惩罚某些错误。
通过这些步骤,我们可以更好地组织和管理 Vue2 项目中的 API 请求,使代码更加清晰和易于维护。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表