news 2026/4/22 13:30:30

Vue——网络请求与数据交互【Axios 封装与请求拦截】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue——网络请求与数据交互【Axios 封装与请求拦截】

背景问题:
需要统一管理 HTTP 请求。

方案思考:
封装 Axios 并添加请求拦截器。

具体实现:

// utils/request.jsimportaxiosfrom'axios'import{ElMessage,ElNotification}from'element-plus'import{useUserStore}from'@/stores/modules/user'// 创建 axios 实例constservice=axios.create({baseURL:import.meta.env.VITE_APP_BASE_API||'/api',timeout:15000,headers:{'Content-Type':'application/json;charset=UTF-8'}})// 请求拦截器service.interceptors.request.use(config=>{// 添加认证 tokenconsttoken=localStorage.getItem('access_token')if(token){config.headers['Authorization']=`Bearer${token}`}// 添加请求时间戳,防止缓存if(config.method==='get'){config.params={...config.params,_t:Date.now()}}console.log('发送请求:',config)returnconfig},error=>{console.error('请求错误:',error)returnPromise.reject(error)})// 响应拦截器service.interceptors.response.use(response=>{constres=response.data// 根据后端约定的状态码处理if(res.code&&res.code!==200){ElMessage.error(res.message||'请求失败')// 401: 未登录或登录已过期if(res.code===401){// 清除用户信息constuserStore=useUserStore()userStore.clearUser()// 跳转到登录页window.location.href='/login'}returnPromise.reject(newError(res.message||'Error'))}else{returnres}},error=>{console.error('响应错误:',error)letmessage='请求失败'if(error.response){// 服务器返回错误状态码conststatus=error.response.statusswitch(status){case400:message='请求参数错误'breakcase401:message='未授权,请重新登录'// 清除用户信息并跳转登录页constuserStore=useUserStore()userStore.clearUser()window.location.href='/login'breakcase403:message='拒绝访问'breakcase404:message='请求资源不存在'breakcase500:message='服务器内部错误'breakdefault:message=`连接错误${status}`}}elseif(error.request){// 请求已发出但没有收到响应message='网络连接异常'}else{// 其他错误message=error.message}ElMessage.error(message)returnPromise.reject(error)})exportdefaultservice

API 接口封装示例:

// api/user.jsimportrequestfrom'@/utils/request'// 获取用户列表exportfunctiongetUserList(params){returnrequest({url:'/users',method:'get',params})}// 获取用户详情exportfunctiongetUserById(id){returnrequest({url:`/users/${id}`,method:'get'})}// 创建用户exportfunctioncreateUser(data){returnrequest({url:'/users',method:'post',data})}// 更新用户exportfunctionupdateUser(id,data){returnrequest({url:`/users/${id}`,method:'put',data})}// 删除用户exportfunctiondeleteUser(id){returnrequest({url:`/users/${id}`,method:'delete'})}// 批量删除用户exportfunctionbatchDeleteUser(ids){returnrequest({url:'/users/batch-delete',method:'post',data:{ids}})}

在组件中使用请求示例:

<template> <div class="user-list"> <el-table :data="userList" v-loading="loading"> <el-table-column prop="id" label="ID" width="100" /> <el-table-column prop="username" label="用户名" /> <el-table-column prop="email" label="邮箱" /> <el-table-column prop="createdAt" label="创建时间" /> <el-table-column label="操作" width="200"> <template #default="{ row }"> <el-button size="small" @click="editUser(row)">编辑</el-button> <el-button size="small" type="danger" @click="deleteUser(row.id)">删除</el-button> </template> </el-table-column> </el-table> <el-pagination v-model:current-page="currentPage" v-model:page-size="pageSize" :total="total" :page-sizes="[10, 20, 50, 100]" layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </div> </template> <script setup> import { ref, onMounted } from 'vue' import { getUserList, deleteUser } from '@/api/user' const userList = ref([]) const loading = ref(false) const currentPage = ref(1) const pageSize = ref(10) const total = ref(0) // 获取用户列表 const fetchUserList = async () => { loading.value = true try { const response = await getUserList({ page: currentPage.value, size: pageSize.value }) userList.value = response.data.list total.value = response.data.total } catch (error) { console.error('获取用户列表失败:', error) } finally { loading.value = false } } // 删除用户 const deleteUserHandler = async (id) => { try { await deleteUser(id) ElMessage.success('删除成功') fetchUserList() // 重新获取列表 } catch (error) { console.error('删除用户失败:', error) } } // 分页处理 const handleSizeChange = (size) => { pageSize.value = size fetchUserList() } const handleCurrentChange = (page) => { currentPage.value = page fetchUserList() } onMounted(() => { fetchUserList() }) </script>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 4:46:01

StructBERT零样本分类器案例:法律文书分类

StructBERT零样本分类器案例&#xff1a;法律文书分类 1. 引言&#xff1a;AI 万能分类器的崛起 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;文本分类是构建智能系统的核心能力之一。传统方法依赖大量标注数据进行监督训练&#xff0c;成本高、周期长&#x…

作者头像 李华
网站建设 2026/4/18 11:51:19

从欧姆定律看三极管驱动LED的限流设计原理

从欧姆定律看三极管驱动LED的限流设计原理你有没有遇到过这种情况&#xff1a;明明代码写对了&#xff0c;MCU也输出高电平了&#xff0c;可LED就是不亮&#xff1f;或者更糟——刚点亮没几秒&#xff0c;灯珠就烧了&#xff1f;问题很可能出在看似简单却暗藏玄机的三极管驱动电…

作者头像 李华
网站建设 2026/4/19 21:00:10

5分钟搞定网易云NCM文件转换:终极免费工具使用指南

5分钟搞定网易云NCM文件转换&#xff1a;终极免费工具使用指南 【免费下载链接】ncmToMp3 网易云vip的ncm文件转mp3/flac - ncm file to mp3 or flac 项目地址: https://gitcode.com/gh_mirrors/nc/ncmToMp3 还在为网易云VIP下载的NCM文件无法在其他播放器播放而烦恼吗&…

作者头像 李华
网站建设 2026/4/20 10:05:01

vivado2023.2下载安装教程:手把手教你完成FPGA开发环境搭建

手把手带你搞定 Vivado 2023.2 安装&#xff1a;从零搭建专业级 FPGA 开发环境 你是不是也曾在准备开启 FPGA 学习之旅时&#xff0c;被那个动辄十几GB的安装包卡在第一步&#xff1f; 下载慢、权限报错、许可证激活失败、GUI闪退……明明只是想点个“下一步”&#xff0c;却…

作者头像 李华
网站建设 2026/4/20 12:50:02

Windows字体渲染终极优化:MacType完全配置指南

Windows字体渲染终极优化&#xff1a;MacType完全配置指南 【免费下载链接】mactype Better font rendering for Windows. 项目地址: https://gitcode.com/gh_mirrors/ma/mactype 还在为Windows系统字体显示模糊、边缘锯齿而烦恼吗&#xff1f;MacType作为一款开源字体渲…

作者头像 李华
网站建设 2026/4/18 20:40:39

RTL8852BE无线网卡驱动:5分钟快速安装与性能优化指南

RTL8852BE无线网卡驱动&#xff1a;5分钟快速安装与性能优化指南 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 为什么选择RTL8852BE驱动 RTL8852BE是一款支持Wi-Fi 6标准的Realtek无线…

作者头像 李华