重生之我在学Vue--第7天 Vue 3 数据请求(Axios)

重生之我在学Vue--第7天 Vue 3 数据请求(Axios)

文章目录

  • [重生之我在学Vue--第7天 Vue 3 数据请求(Axios)](#重生之我在学Vue--第7天 Vue 3 数据请求(Axios))
    • 前言
    • [一、Axios 基础:从安装到实战](#一、Axios 基础:从安装到实战)
      • [1.1 安装与全局配置](#1.1 安装与全局配置)
      • [1.2 四大请求方法实战](#1.2 四大请求方法实战)
        • [GET 请求:获取任务列表](#GET 请求:获取任务列表)
        • [POST 请求:新增任务](#POST 请求:新增任务)
        • [PUT & DELETE 请求:更新与删除](#PUT & DELETE 请求:更新与删除)
    • 二、拦截器:打造智能请求管道
      • [2.1 请求拦截器(统一添加 Token)](#2.1 请求拦截器(统一添加 Token))
      • [2.2 响应拦截器(统一错误处理)](#2.2 响应拦截器(统一错误处理))
    • [三、Axios + Pinia 黄金组合](#三、Axios + Pinia 黄金组合)
      • [3.1 在 Store 中封装 API 调用](#3.1 在 Store 中封装 API 调用)
      • [3.2 组件中优雅调用](#3.2 组件中优雅调用)
    • [四、实战任务:集成 RESTful API](#四、实战任务:集成 RESTful API)
      • [4.1 接口模拟(使用 Mock.js)](#4.1 接口模拟(使用 Mock.js))
      • [4.2 完整 CRUD 实现流程图](#4.2 完整 CRUD 实现流程图)
    • 总结与思考

前言

数据交互是前后端分离开发的核心环节,Axios 作为 Vue 生态中最流行的 HTTP 客户端,能帮助我们高效管理异步请求。今天的重点是在 Vue 3 中集成 Axios,并结合 Pinia 状态管理实现数据流的闭环。

Vue3 官方中文文档传送点: 简介 | Vue.js

Vue3 的中文官方文档学习笔记很全还有练习场,推荐去官网学习

Vue前端成仙之路:Vue 前端成仙之路_野生的程序媛的博客-CSDN博客

GO后端成神之路:Go 后端成神之路_野生的程序媛的博客-CSDN博客


一、Axios 基础:从安装到实战

1.1 安装与全局配置

bash 复制代码
npm install axios

src/utils 目录下创建 request.js,配置全局实例:

javascript 复制代码
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 请求:获取任务列表
javascript 复制代码
// 在组件中调用
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 请求:新增任务
javascript 复制代码
const addTask = async (taskData) => {
  await service.post('/tasks', taskData)
}
PUT & DELETE 请求:更新与删除
javascript 复制代码
// 更新任务
const updateTask = async (id, newData) => {
  await service.put(`/tasks/${id}`, newData)
}

// 删除任务
const deleteTask = async (id) => {
  await service.delete(`/tasks/${id}`)
}

二、拦截器:打造智能请求管道

2.1 请求拦截器(统一添加 Token)

javascript 复制代码
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 响应拦截器(统一错误处理)

javascript 复制代码
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 调用

javascript 复制代码
// 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 组件中优雅调用

vue 复制代码
<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)

javascript 复制代码
// 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 实现流程图

是 否 组件触发Action Pinia调用Axios 请求成功? 更新Store状态 全局错误处理 视图自动更新


总结与思考

  1. 分层架构思维:将请求逻辑封装在 Store 层,保持组件专注 UI 交互
  2. 错误处理标准化:通过拦截器实现统一的异常处理流程
  3. 性能优化方向
    • 添加请求取消功能(避免重复请求)
    • 实现接口级缓存(减少重复请求)

明日预告:Day8 将引入 Element Plus,为我们的任务管理系统打造专业级 UI 界面!

相关推荐
猫猫不是喵喵.33 分钟前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~2 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华2 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子5 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅5 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni5 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学6 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端
赵庆明老师7 小时前
Vben精讲:21-详解web-antd:tsconfig.json
前端·json·vim
wc887 小时前
微软EDGE浏览器功能学习
前端·学习·edge