前端项目Axios封装Vue3详细教程(附源码)

前端项目Axios封装Vue3详细教程(附源码)


在这里插入图片描述

一、引言

在前端项目开发中,HTTP请求是不可或缺的一部分。Axios作为一个基于Promise的HTTP客户端,因其易用性和丰富的功能而广受欢迎。在Vue3项目中,合理地封装Axios不仅可以提高开发效率,还可以增强代码的可维护性和可读性。本文将详细介绍如何在Vue3项目中封装Axios,包括请求拦截器中添加加载框、响应拦截器中处理各类状态码等高级功能,并给出详细的教程和可直接使用的代码。

二、Axios安装与基本使用
1. 安装Axios

首先,你需要在Vue3项目中安装Axios。可以使用npm或yarn进行安装:

npm install axios
# 或者
yarn add axios
2. 基本使用

安装完成后,你可以在Vue组件中直接使用Axios发送HTTP请求。例如:

import axios from 'axios';axios.get('https://api.example.com/data').then(response => {console.log(response.data);}).catch(error => {console.error(error);});
三、Axios封装流程

为了更好地管理HTTP请求,我们需要对Axios进行封装。以下是封装Axios的详细流程:

1. 创建Axios实例

在项目根目录或src目录下创建一个新的文件夹(如utils),并在其中创建一个文件(如request.js),用于创建Axios实例和配置相关参数。

// src/utils/request.js
import axios from 'axios';// 创建Axios实例
const instance = axios.create({baseURL: 'https://api.example.com', // API的基础URLtimeout: 10000, // 请求超时时间headers: {'Content-Type': 'application/json'}
});export default instance;
2. 配置请求拦截器

请求拦截器可以在请求发送之前对请求进行一些处理,如添加token、设置请求头等。此外,我们还可以在请求拦截器中添加加载框,以提示用户请求正在进行中。

假设我们使用的是一个简单的加载框组件(如LoadingComponent),它可以通过Vue的全局状态管理(如Vuex)或事件总线来控制显示和隐藏。

// src/utils/request.js (继续添加代码)
import store from '@/store'; // 假设我们有一个Vuex store来管理加载框状态// 请求拦截器
instance.interceptors.request.use(config => {// 从localStorage或Vuex中获取tokenconst token = localStorage.getItem('token');if (token) {config.headers.Authorization = `Bearer ${token}`;}// 显示加载框store.commit('setLoading', true); // 假设我们有一个mutation叫`setLoading`return config;},error => {// 隐藏加载框(请求出错时)store.commit('setLoading', false);return Promise.reject(error);}
);

在这里,我们假设Vuex store中有一个loading状态,用于控制加载框的显示和隐藏。你需要根据自己的项目实际情况来调整这部分代码。

3. 配置响应拦截器

响应拦截器可以在响应返回之后对响应进行一些处理,如统一处理错误、转换响应数据格式等。我们还可以根据响应的状态码来执行不同的操作,如显示错误通知、跳转到登录页面等。

// src/utils/request.js (继续添加代码)
import { Message } from 'element-ui'; // 假设我们使用Element UI来显示通知
import router from '@/router'; // 引入Vue Router// 响应拦截器
instance.interceptors.response.use(response => {// 隐藏加载框store.commit('setLoading', false);// 对响应数据进行处理,如统一格式const res = response.data;if (res.code !== 200) {// 根据不同的状态码执行不同的操作switch (res.code) {case 401:// 未登录或token过期,跳转到登录页面router.push('/login');break;case 403:// 无权限访问Message.error('无权限访问');break;default:// 其他错误Message.error(res.message || '请求出错');}return Promise.reject(new Error(res.message || 'Error'));} else {return res;}},error => {// 隐藏加载框(请求出错时)store.commit('setLoading', false);// 对错误进行处理,如显示通知if (error.response) {switch (error.response.status) {case 401:// 未登录或token过期,跳转到登录页面router.push('/login');break;case 403:// 无权限访问Message.error('无权限访问');break;case 404:// 资源未找到Message.error('资源未找到');break;default:// 其他错误Message.error('请求出错');}} else {Message.error('网络错误');}return Promise.reject(error);}
);

在这里,我们使用了Element UI的Message组件来显示通知,并根据响应的状态码执行了不同的操作。你需要根据自己的项目实际情况来调整这部分代码,比如使用其他的通知库或自定义的错误处理方式。

4. 封装请求方法

为了方便调用,我们可以将常用的HTTP请求方法(如GET、POST、PUT、DELETE等)封装成函数。

// src/utils/request.js (继续添加代码)export function get(url, params = {}) {return instance.get(url, { params });
}export function post(url, data = {}) {return instance.post(url, data);
}export function put(url, data = {}) {return instance.put(url, data);
}export function del(url) {return instance.delete(url);
}
四、在Vue3项目中使用封装后的Axios
1. 引入封装后的Axios

在需要使用Axios的Vue组件中引入封装后的Axios实例和请求方法。

// src/views/Home.vue
<template><div><h1>Home</h1><p>{{ message }}</p></div>
</template><script>
import { get } from '@/utils/request';export default {data() {return {message: ''};},created() {this.fetchData();},methods: {async fetchData() {try {const response = await get('/api/data');this.message = response.data;} catch (error) {console.error(error);}}}
};
</script>
2. 调用请求方法

在组件的方法中调用封装好的请求方法,即可发送HTTP请求并处理响应。由于我们已经在请求拦截器和响应拦截器中处理了加载框和错误通知,因此在组件中无需再额外处理这些逻辑。

五、封装细节与优化
1. 加载框的显示与隐藏

在请求拦截器中显示加载框,在响应拦截器和请求出错时隐藏加载框。这样可以确保加载框在请求进行时显示,并在请求完成后及时隐藏。

2. 错误处理与通知

在响应拦截器中,我们根据响应的状态码执行了不同的操作,如跳转到登录页面、显示错误通知等。这样可以统一处理错误,提高用户体验。

3. 请求方法的封装

将常用的HTTP请求方法封装成函数,方便在组件中调用。这样可以减少重复代码,提高开发效率。

4. 可扩展性

我们的封装方式具有良好的可扩展性。如果未来需要添加新的请求方法或处理新的状态码,只需在request.js文件中进行相应的修改即可。

六、封装流程单与表格
封装流程单
  1. 安装Axios:使用npm或yarn安装Axios。

  2. 创建Axios实例:在utils文件夹中创建request.js文件,并创建Axios实例。

  3. 配置请求拦截器

    • 从localStorage或Vuex中获取token,并添加到请求头中。
    • 显示加载框。
  4. 配置响应拦截器

    • 隐藏加载框。
  5. 配置响应拦截器

    • 根据响应的状态码执行不同的操作,如处理未登录、无权限访问、资源未找到等错误。
    • 对响应数据进行统一处理,如格式转换或错误消息提取。
    • 隐藏加载框(响应完成或出错时)。
  6. 封装请求方法

    • 将常用的HTTP请求方法(GET、POST、PUT、DELETE等)封装成易于调用的函数。
    • 提供可选的参数配置,如请求参数或请求体数据。
  7. 在Vue组件中使用

    • 在需要发送HTTP请求的Vue组件中引入封装后的Axios实例和请求方法。
    • 调用请求方法发送请求,并处理响应数据或错误。
封装细节优化表格
优化点描述
加载框管理在请求拦截器中显示加载框,在响应拦截器和错误处理中隐藏加载框,确保用户体验。
错误统一处理在响应拦截器中根据状态码统一处理错误,如跳转登录、显示通知,减少重复代码。
请求方法封装封装GET、POST等常用请求方法,简化调用,提高代码可读性和开发效率。
可扩展性封装设计易于扩展,未来可轻松添加新请求方法或处理新状态码。
配置集中管理Axios实例的配置(如baseURL、timeout)集中在一处管理,方便修改和维护。
Token自动附加请求拦截器自动从localStorage或Vuex中获取并附加Token,简化请求头管理。
响应数据统一处理对响应数据进行统一格式处理或错误消息提取,减少组件中重复处理逻辑。
七、实践案例与代码片段
实践案例

假设我们有一个用户信息管理模块,需要获取用户列表、添加新用户、更新用户信息和删除用户。使用封装后的Axios,我们可以轻松实现这些功能。

获取用户列表
// src/views/UserList.vue
<template><div><h1>User List</h1><ul><li v-for="user in users" :key="user.id">{{ user.name }}</li></ul></div>
</template><script>
import { get } from '@/utils/request';export default {data() {return {users: []};},created() {this.fetchUsers();},methods: {async fetchUsers() {try {const response = await get('/api/users');this.users = response.data;} catch (error) {console.error('Failed to fetch users:', error);}}}
};
</script>
添加新用户
// src/views/AddUser.vue
<template><div><h1>Add User</h1><form @submit.prevent="addUser"><input v-model="newUser.name" placeholder="Enter user name" required /><button type="submit">Add User</button></form></div>
</template><script>
import { post } from '@/utils/request';export default {data() {return {newUser: {name: ''}};},methods: {async addUser() {try {await post('/api/users', this.newUser);this.$message.success('User added successfully');this.newUser.name = ''; // Reset form} catch (error) {console.error('Failed to add user:', error);this.$message.error('Failed to add user');}}}
};
</script>
更新和删除用户

类似地,我们可以使用putdel方法来更新和删除用户信息。这里不再赘述具体代码,但你可以想象它们的使用方式与getpost非常相似,只是请求的URL和方法名有所不同。

八、总结与展望

通过本文的介绍,我们学习了如何在Vue3项目中封装Axios,包括创建Axios实例、配置请求和响应拦截器、封装请求方法以及在Vue组件中使用封装后的Axios。这种封装方式不仅提高了开发效率,还增强了代码的可维护性和可读性。




快,让 我 们 一 起 去 点 赞 !!!!在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/71913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手写一个Tomcat

Tomcat 是一个广泛使用的开源 Java Servlet 容器&#xff0c;用于运行 Java Web 应用程序。虽然 Tomcat 本身功能强大且复杂&#xff0c;但通过手写一个简易版的 Tomcat&#xff0c;我们可以更好地理解其核心工作原理。本文将带你一步步实现一个简易版的 Tomcat&#xff0c;并深…

在 UniApp 开发的网站中使图片能够缓存,不一直刷新

在 UniApp 开发的网站中&#xff0c;要使图片能够缓存&#xff0c;不一直刷新&#xff0c;可以考虑以下几种方法&#xff1a; 1. 使用适当的 HTTP 缓存头 确保你的服务器在响应图片时&#xff0c;返回合适的缓存控制 HTTP 头。以下是一些常用的 HTTP 头来控制缓存&#xff1a…

Makefile——make工具编译STM32工程

一、Makefile相关指令 1.1、变量 符号含义替换追加:恒等于 1.2、隐含规则 符号含义%.o任意的.o文件*.o所有的.o文件 1.3、通配符 符号含义$^所有依赖文件$所有目标文件$<所有依赖文件的第一个文件 1.4、编译器指令常用参数功能说明 符号含义举例-E预处理&#xff0c;…

深入理解Linux文件系统权限:从基础到高级应用全解析

1. 什么是文件系统权限&#xff1f;它是如何工作的&#xff1f; 文件权限的本质 想象你的电脑是一个大房子&#xff0c;每个文件和目录都是房间里的物品。文件系统权限就像是一把钥匙&#xff0c;决定谁能进房间、能看什么、能修改什么。 权限三要素&#xff1a; 读&#xff…

C语言:6.22练习题数组解答

#include <stdio.h> #include <string.h> // 用于 strlen() int main() {char a[100];int j 0;// 从用户输入读取字符串printf("请输入一个字符串: ");fgets(a, sizeof(a), stdin);// 遍历字符串中的每个字符for (int i 0; i < strlen(a); i) {if (…

一、docker的安装

一、docker桌面 二、docker的配置文件 1、docker配置文件位置/etc/docker/daemon.json 使用json格式&#xff0c;graphdata-root {"graph":"/deploy/docker","registry-mirrors": ["https://8auvmfwy.mirror.aliyuncs.com"],"…

Matlab 多项式拟合点法线(二维)

文章目录 一、简介二、实现代码三、实现效果一、简介 这个思路其实很简单,假设我们有一组曲线点,我们可以对其拟合曲线并计算其导数来获取每个点的法向量,当然这一思路也可以扩展至三维。具体过程如下所示: 二、实现代码 %% *********

DeepSeek-R1 论文阅读总结

1. QA问答&#xff08;我的笔记&#xff09; Q1: DeepSeek如何处理可读性问题&#xff1f; 通过构建冷启动数据&#xff08;数千条长CoT数据&#xff09;微调基础模型&#xff0c;结合多阶段训练流程&#xff08;RL训练、拒绝采样生成SFT数据&#xff09;&#xff0c;并优化输…

Manus AI:多语言手写识别的技术革命与未来图景

摘要&#xff1a;在全球化浪潮下&#xff0c;跨语言沟通的需求日益迫切&#xff0c;但手写文字的多样性却成为技术突破的难点。Manus AI凭借其多语言手写识别技术&#xff0c;将潦草笔迹转化为精准数字文本&#xff0c;覆盖全球超百种语言。本文从技术原理、应用场景、行业价值…

Flutter——最详细原生交互(MethodChannel、EventChannel、BasicMessageChannel)使用教程

MethodChannel&#xff08;方法通道&#xff09; 用途&#xff1a;实现 双向通信&#xff0c;用于调用原生平台提供的 API 并获取返回结果。 场景&#xff1a;适合一次性操作&#xff0c;如调用相机、获取设备信息等。 使用步骤&#xff1a; Flutter 端&#xff1a;通过 Meth…

Python控制语句-循环语句-while

1.若k为整形,下述while循环执行的次数为()。 k=1000 while k>1: print(k) k=k/2 A、9 B、10 C、11 D、100 答案:A。k=k/2意味着每循环一次,k的值就会变为原来的一半,直到k的值不大于1。 2.下面的代码,哪些会输出1,2,3三个数字( )。 A、 for i in range(3): print(i) …

十二天-双指针技术:链表问题的高效解法

一、双指针技术分类 1. 同速双指针&#xff08;同向移动&#xff09; 特点&#xff1a;两个指针以相同速度移动适用场景&#xff1a; 链表逆序查找倒数第 k 个元素删除倒数第 n 个节点 2. 快慢双指针&#xff08;异速移动&#xff09; 特点&#xff1a;一个指针每次移动 1 步…

【vllm】Qwen2.5-VL-72B-AWQ 部署记录

版本&#xff1a;0.7.2 注意事项&#xff1a; export LD_LIBRARY_PATH/home/xxxxx/anaconda3/envs/xxxxx/lib/python3.10/site-packages/nvidia/nvjitlink/lib:$LD_LIBRARY_PATH # 如果报错可能需要Also pip install --force-reinstall githttps://github.com/huggingface/tra…

深度学习与大模型-张量

大家好&#xff01;今天我们来聊聊张量&#xff08;Tensor&#xff09;。别被这个词吓到&#xff0c;其实它没那么复杂。 什么是张量&#xff1f; 简单来说&#xff0c;张量就是一个多维数组。你可以把它看作是一个装数据的容器&#xff0c;数据的维度可以是一维、二维&#…

【前端面试题】Vu3常见的面试题

1.Vue3与 Vue2的核心区别有哪些&#xff1f; ‌ 响应式系统 ‌&#xff1a; ‌ Vue2&#xff1a;通过Object.defineProperty 实现响应式。这种方式在处理对象属性的添加和删除时存在局限性&#xff0c;且无法直接监控数组的变化 ‌;‌Vue3&#xff1a;采用Proxy 实现响应式&…

Android 粘包与丢包处理工具类:支持多种粘包策略的 Helper 实现

在Android开发中&#xff0c;处理TCP/UDP通信时&#xff0c;粘包和丢包是常见的问题。粘包是指多个数据包被接收方一次性接收&#xff0c;导致数据包之间的界限不清晰&#xff1b;丢包则是指数据包在传输过程中丢失。为了处理这些问题&#xff0c;我们可以编写一个帮助类 Packe…

【C++11】移动语义

回顾 const int c的c是可以被取地址的&#xff0c;尽管是常量。所以以是否为常量来判断是否为右值是错误的。 左值与右值正确的区分方法是是否能够被取地址。&#xff08;能被取地址也就代表着是一个持久状态&#xff0c;即有持久的存储空间的值&#xff09; 常见的左值有我们…

LangChain教程 - Agent -之 ZERO_SHOT_REACT_DESCRIPTION

在构建智能 AI 助手时&#xff0c;我们希望模型能够智能地调用工具&#xff0c;以便提供准确的信息。LangChain 提供了 AgentType.ZERO_SHOT_REACT_DESCRIPTION&#xff0c;它结合了 ReAct&#xff08;Reasoning Acting&#xff09;策略&#xff0c;使得 LLM 可以基于工具的描…

移动Android和IOS自动化中常见问题

APP测试逻辑 在app编写自动化测试用例时&#xff0c;通常会出现只是简单的点点点过程&#xff0c;然而却忽略了在实际的自动化实现过程中&#xff0c;软件是对app元素的判断来执行测试脚本。所以会出现在后期已经写好自动化脚本之后还会对测试用例的更新。 App在测试时&#…

python高效试用17---两个字符串组成一个新的字符串和两个字符串组成元组作为key哪个更高效

在 Python 中&#xff0c;使用字符串连接 (str1 str2) 作为 key 和使用元组 ((str1, str2)) 作为 key 的效率差异&#xff0c;主要受以下因素影响&#xff1a; 哈希计算速度&#xff1a; 字符串连接 (str1 str2)&#xff1a;会创建一个新的字符串对象&#xff0c;并计算哈希…