重生之我在学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 界面!

相关推荐
卑微小文1 分钟前
企业级IP代理安全防护:数据泄露风险的5个关键防御点
前端·后端·算法
SameX2 分钟前
HarmonyOS Next ohpm-repo私有仓库的配置与优化
前端·harmonyos
咪库咪库咪3 分钟前
async await
前端·javascript
华科云商xiao徐4 分钟前
用TypeScript和library needle来创建视频爬虫程序
前端
养生匠5 分钟前
我写了个yapi 转化前端ts请求接口的代码,真的很好用
javascript
hahala23335 分钟前
依赖注入(DI)
javascript·node.js
任尔东西南北风8 分钟前
前端请求工具封装
前端·javascript
刺客_Andy9 分钟前
vue3 第二十九节 (vue3 事件循环之nextTick)
前端·vue.js
Audi_A4L11 分钟前
RxJS的设计原理以及用了哪些设计模式
前端
小鱼冻干11 分钟前
node.js-net模块
前端·node.js