Vue2与Vue3中axios的配置与封装实践
1. 为什么我们需要关注axios在Vue中的使用作为前端开发者我们每天都在和各种API打交道。记得我刚入行时每次遇到接口调用问题都要折腾半天直到发现了axios这个神器。它就像是一个专业的快递员帮我们在前端和后端之间可靠地传递数据。而在Vue项目中axios更是成为了异步请求的事实标准。Vue2和Vue3虽然核心思想一脉相承但在axios的使用上还是有些值得注意的区别。特别是在组合式API引入后我们的请求逻辑可以组织得更加优雅。今天我就结合自己五年来在Vue项目中的实战经验跟大家详细聊聊axios在Vue2和Vue3中的正确打开方式。2. 基础配置与封装艺术2.1 安装与基本配置无论是Vue2还是Vue3第一步都是安装axiosnpm install axios但聪明的开发者不会直接使用裸axios。想象一下如果每个组件都直接引入axios就像每个部门都自己联系快递公司既浪费资源又难以统一管理。我们应该创建一个统一的请求实例// src/utils/request.js import axios from axios const service axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 10000 })这里有几个关键配置值得注意baseURL: 建议通过环境变量配置这样不同环境可以自动切换timeout: 根据项目实际情况设置我一般设为10秒生产环境记得配置withCredentials来处理跨域凭证2.2 拦截器的妙用拦截器就像是给快递加装的GPS和安检系统。我们可以通过它们统一处理请求和响应// 请求拦截器 service.interceptors.request.use( config { // 在发送请求前做些处理比如添加token if (store.getters.token) { config.headers[X-Token] getToken() } return config }, error { return Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( response { const res response.data if (res.code ! 200) { // 处理业务错误 return Promise.reject(new Error(res.message || Error)) } return res }, error { // 处理HTTP错误 return Promise.reject(error) } )重要提示拦截器中的错误处理一定要完善否则一个接口报错可能导致整个应用崩溃。我曾在项目中因为没有正确处理401错误导致用户退出登录后页面卡死。3. Vue2中的axios集成方案3.1 全局挂载方式在Vue2中最常见的做法是把axios挂载到Vue原型上// main.js import Vue from vue import axios from ./utils/request Vue.prototype.$http axios然后在组件中就可以这样使用this.$http.get(/user/list)这种方式简单直接但有两个潜在问题类型提示不友好对TypeScript项目不友好在非组件上下文中无法直接使用3.2 按需引入模式对于大型项目我更喜欢按需引入的方式import request from /utils/request export default { methods: { fetchData() { request.get(/api/data).then(response { // 处理数据 }) } } }这种方式虽然写起来稍显繁琐但有以下优势依赖关系更清晰便于Tree Shaking优化适合模块化程度高的项目4. Vue3中的现代化用法4.1 组合式API的最佳实践Vue3的组合式API让我们的请求逻辑可以组织得更加优雅。来看一个用户管理的例子// src/composables/useUser.js import { ref } from vue import request from /utils/request export function useUser() { const users ref([]) const loading ref(false) const error ref(null) const fetchUsers async () { try { loading.value true const { data } await request.get(/users) users.value data } catch (err) { error.value err } finally { loading.value false } } return { users, loading, error, fetchUsers } }在组件中使用script setup import { useUser } from /composables/useUser const { users, loading, error, fetchUsers } useUser() // 生命周期中调用 onMounted(() { fetchUsers() }) /script这种方式将请求逻辑完全解耦具有以下优点逻辑复用性高状态管理清晰测试更加方便4.2 与Suspense配合使用Vue3的Suspense特性可以让我们更好地处理异步状态template Suspense template #default UserList / /template template #fallback LoadingSpinner / /template /Suspense /template script setup // UserList.vue const { data } await request.get(/users) /script5. 高级技巧与性能优化5.1 请求取消机制在处理复杂交互时请求取消能避免竞态条件和资源浪费const CancelToken axios.CancelToken let cancel request.get(/user, { cancelToken: new CancelToken(function executor(c) { cancel c }) }) // 取消请求 cancel()我在商品搜索功能中就应用了这个技术当用户快速输入时会自动取消前一个未完成的搜索请求。5.2 缓存策略实现对于不常变的数据可以添加简单缓存const cache new Map() async function getWithCache(url) { if (cache.has(url)) { return cache.get(url) } const response await request.get(url) cache.set(url, response.data) return response.data }注意缓存策略要根据业务需求设计对于实时性要求高的数据不要使用缓存。5.3 并发请求优化当需要同时发送多个请求时使用axios.all可以提升效率const [userData, productData] await axios.all([ request.get(/user), request.get(/products) ])6. 常见问题排坑指南6.1 跨域问题解决方案虽然axios本身不能解决跨域但我们可以这样配置// vue.config.js module.exports { devServer: { proxy: { /api: { target: http://your-api-server.com, changeOrigin: true, pathRewrite: { ^/api: } } } } }6.2 类型扩展技巧TypeScript为了让axios更好地支持TypeScript我们可以扩展类型定义// src/types/axios.d.ts import { AxiosRequestConfig } from axios declare module axios { interface AxiosRequestConfig { loading?: boolean mock?: boolean } }6.3 文件上传实现文件上传是个常见需求axios可以这样处理const formData new FormData() formData.append(file, file) const response await request.post(/upload, formData, { headers: { Content-Type: multipart/form-data } })7. 测试策略与Mock方案7.1 单元测试编写测试axios请求时我们可以使用jest-mock-axiosimport mockAxios from jest-mock-axios afterEach(() { mockAxios.reset() }) test(fetchUser returns user data, async () { const promise getUser(123) mockAxios.mockResponse({ data: { id: 123, name: John } }) const user await promise expect(user.name).toBe(John) })7.2 Mock服务搭建开发阶段可以使用Mock.js创建模拟数据import Mock from mockjs Mock.mock(/api/user, { list|10: [{ id|1: 1, name: cname }] })8. 项目实战经验分享在我最近参与的电商后台项目中我们遇到了接口版本管理的问题。最终我们通过axios的实例配置解决了const v1 axios.create({ baseURL: /api/v1 }) const v2 axios.create({ baseURL: /api/v2 })另一个经验是关于错误处理的。我们创建了一个统一的错误处理中心// errorHandler.js export function handleError(error) { if (error.response) { switch (error.response.status) { case 401: router.push(/login) break case 403: showToast(无权限访问) break default: showToast(error.message) } } }然后在拦截器中统一调用service.interceptors.response.use( response response, error { handleError(error) return Promise.reject(error) } )这种集中式错误处理让我们的代码更加整洁也更容易维护。

相关新闻

UVM编码规范实战:Easier UVM模板与代码生成器避坑指南

UVM编码规范实战:Easier UVM模板与代码生成器避坑指南

简介:这份资源是Doulos出品的《Easier UVM Coding Guidelines》编码指南,面向已掌握SystemVerilog与UVM基础、希望提升验证代码一致性与复用性的硬件验证工程师及项目管理者。它针对团队中编码风格各异、维护成本高、验证环境难以从块级复用到系统级等痛…

2026/10/14 10:07:26 阅读更多 →
AI 把 C 改写成 Python,功能就迁移了吗?跨语言改写如何验证行为一致

AI 把 C 改写成 Python,功能就迁移了吗?跨语言改写如何验证行为一致

从“代码改写出来了”到“功能迁移完成”,中间还差一份行为证据。 用 AI 把 C 代码改写成 Python,最直观的变化是文件换了后缀,函数也能运行了。但调用方真正依赖的是:同样的输入得到什么结果,错误如何报告&#xff0c…

2026/10/14 10:06:21 阅读更多 →
绯色回响拉斐拉角色介绍 绯色回响拉斐拉技能详解

绯色回响拉斐拉角色介绍 绯色回响拉斐拉技能详解

绯色回响拉斐拉凭借独特的一体双魂形态机制,兼顾护盾保护与输出能力,在不少攻坚阵容里站稳了核心位置。绯色回响拉斐拉拥有白、红两套形态,技能体系围绕“死亡感知”层层叠加,双形态在回合结束自动切换,想看清双形态切…

2026/10/14 10:06:21 阅读更多 →

最新新闻

Python实现重复文档查找与清理工具

Python实现重复文档查找与清理工具

1. 重复文档查找工具的设计与实现在日常工作中,我们经常会遇到文档重复的问题,特别是从QQ、微信等平台接收的文件,经常会在不同文件夹中保存多份相同内容但不同名称的文件。这些重复文件不仅占用宝贵的存储空间,还会导致文件管理混…

2026/10/14 11:02:10 阅读更多 →
SpringBoot文旅系统开发:微服务架构与智能推荐实践

SpringBoot文旅系统开发:微服务架构与智能推荐实践

1. 项目背景与核心价值 绍兴作为拥有2500年建城史的文化名城,其"水乡、桥乡、酒乡、书法之乡"的文旅资源数字化呈现具有典型示范意义。这个基于SpringBoot的旅游系统毕业设计,实际上构建了一个可复用的区域文旅数字化解决方案原型。我在参与某…

2026/10/14 11:02:10 阅读更多 →
自考备考:8款工具有效降低AI误判率

自考备考:8款工具有效降低AI误判率

1. 项目背景与核心价值作为一名连续5年参与自学考试辅导的从业者,我深刻理解考生在备考过程中面临的核心痛点。2023年某省自考办统计数据显示,78%的考生在主观题作答时因表述不规范被系统误判为AI生成内容,导致平均每科损失12-15分。这种现象…

2026/10/14 11:02:10 阅读更多 →
AI辅助自考工具测评:如何科学选择与使用

AI辅助自考工具测评:如何科学选择与使用

1. 自考备考新趋势:AI辅助工具的崛起与选择困境作为一名连续三年跟踪自考工具演变的备考顾问,我亲眼见证了AI技术如何重塑自学考试的准备方式。2023年以前,考生们还在用纸质笔记和传统题库;而到了2025年,已有78%的自考…

2026/10/14 11:02:10 阅读更多 →
给AI Agent配一套Skills工程工作流:从玩具到工具的落地指南

给AI Agent配一套Skills工程工作流:从玩具到工具的落地指南

最近一段时间,AI Agent 的热度又起来了,但真正能把 Agent 用进生产环境的人其实不多。我见过太多团队把 Agent 当成一个“聊天机器人”来调,结果 Chat 的时候什么都好,一放到工作流里就怎么都不对。今天想聊的这套东西&#xff0c…

2026/10/14 11:02:10 阅读更多 →
C++字符类型char与wchar_t深度解析

C++字符类型char与wchar_t深度解析

1. 理解C中的字符类型本质在C开发中,字符处理是每个程序员都会遇到的基础问题。char和wchar_t看似简单,但背后涉及字符编码、国际化支持等复杂概念。我们先从内存层面理解它们的物理差异:char类型保证至少8位宽度,这源于C语言的遗…

2026/10/14 11:01:09 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →