马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
重生之我在学Vue–第7天 Vue 3 数据请求(Axios)
前言
数据交互是前后端分离开发的核心环节,Axios 作为 Vue 生态中最流行的 HTTP 客户端,能资助我们高效管理异步请求。本日的重点是在 Vue 3 中集成 Axios,并结合 Pinia 状态管理实现数据流的闭环。
Vue3 官方中文文档传送点: 简介 | Vue.js
Vue3 的中文官方文档学习条记很全还有练习场,推荐去官网学习
Vue前端成仙之路:Vue 前端成仙之路_野生的步伐媛的博客-CSDN博客
GO后端成神之路:Go 后端成神之路_野生的步伐媛的博客-CSDN博客
一、Axios 底子:从安装到实战
1.1 安装与全局配置
在 src/utils 目录下创建 request.js,配置全局实例:
- import axios from 'axios'
- // 创建 Axios 实例
- const service = axios.create({
- baseURL: 'https://your-api-domain.com', // 接口基础路径
- timeout: 10000, // 超时时间
- headers: { 'Content-Type': 'application/json' } // 公共请求头
- })
- export default service
复制代码 1.2 四大请求方法实战
GET 请求:获取任务列表
- // 在组件中调用
- import service from '@/utils/request'
- const fetchTasks = async () => {
- try {
- const response = await service.get('/tasks')
- console.log(response.data)
- } catch (error) {
- console.error('请求失败:', error)
- }
- }
复制代码 POST 请求:新增任务
- const addTask = async (taskData) => {
- await service.post('/tasks', taskData)
- }
复制代码 PUT & DELETE 请求:更新与删除
- // 更新任务
- const updateTask = async (id, newData) => {
- await service.put(`/tasks/${id}`, newData)
- }
- // 删除任务
- const deleteTask = async (id) => {
- await service.delete(`/tasks/${id}`)
- }
复制代码 二、拦截器:打造智能请求管道
2.1 请求拦截器(同一添加 Token)
- service.interceptors.request.use(
- config => {
- const token = localStorage.getItem('token')
- if (token) {
- config.headers.Authorization = `Bearer ${token}`
- }
- return config
- },
- error => Promise.reject(error)
- )
复制代码 2.2 响应拦截器(同一错误处理)
- service.interceptors.response.use(
- response => {
- // 处理标准响应结构
- if (response.data.code === 200) {
- return response.data
- } else {
- return Promise.reject(response.data.message)
- }
- },
- error => {
- // 处理 HTTP 状态码异常
- if (error.response.status === 401) {
- router.push('/login')
- }
- return Promise.reject(error)
- }
- )
复制代码 三、Axios + Pinia 黄金组合
3.1 在 Store 中封装 API 调用
- // stores/task.js
- import { defineStore } from 'pinia'
- import service from '@/utils/request'
- export const useTaskStore = defineStore('task', {
- actions: {
- async fetchTasks() {
- try {
- const res = await service.get('/tasks')
- this.tasks = res.data
- } catch (error) {
- console.error('加载任务失败:', error)
- }
- },
- async addTask(task) {
- await service.post('/tasks', task)
- this.fetchTasks() // 自动刷新列表
- }
- }
- })
复制代码 3.2 组件中优雅调用
- <script setup>
- import { useTaskStore } from '@/stores/task'
- const taskStore = useTaskStore()
- // 初始化加载数据
- onMounted(() => {
- taskStore.fetchTasks()
- })
- // 提交新任务
- const handleSubmit = async () => {
- await taskStore.addTask(newTask.value)
- }
- </script>
复制代码 四、实战任务:集成 RESTful API
4.1 接口模拟(利用 Mock.js)
- // mock/task.js
- import Mock from 'mockjs'
- Mock.mock('/tasks', 'get', {
- 'code': 200,
- 'data|5-10': [{
- 'id|+1': 1,
- 'title': '@ctitle',
- 'completed': '@boolean'
- }]
- })
复制代码 4.2 完整 CRUD 实现流程图
总结与思考
- 分层架构思维:将请求逻辑封装在 Store 层,保持组件专注 UI 交互
- 错误处理标准化:通过拦截器实现同一的非常处理流程
- 性能优化方向:
• 添加请求取消功能(制止重复请求)
• 实现接口级缓存(淘汰重复请求)
明日预报:Day8 将引入 Element Plus,为我们的任务管理体系打造专业级 UI 界面!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |