Vue3 Ajax(axios)

现代前端页面几乎都要与后端交换数据:登录校验、列表加载、表单提交,样样离不开网络请求。原生 XMLHttpRequest 语法繁琐,fetch 又偏底层,于是基于 Promise 的 axios 成为 Vue 项目中最常用的 Ajax 库。它同时支持浏览器与 Node.js,拦截器、取消请求等能力开箱即用,是连接 Vue 组件与后端接口的桥梁。

安装 axios

在 Vue 项目根目录执行下面的命令安装依赖:

npm install axios

安装完成后,在组件或工具文件中直接 import 即可使用。

GET 请求

GET 用于获取数据,查询参数通过 params 选项传递:

import axios from 'axios'

axios.get('https://api.example.com/users', {
  params: { page: 1, size: 10 }
}).then((res) => {
  console.log(res.data) // 输出:第 1 页的用户列表
}).catch((err) => {
  console.error('请求失败:' + err.message) // 输出:请求失败:xxx
})

axios 的响应对象里,data 字段就是服务端返回的业务数据,注释中的输出可在浏览器控制台看到。

POST 请求

POST 用于提交数据,第二个参数直接传对象,axios 会自动序列化为 JSON:

axios.post('/api/login', {
  username: 'zhangsan',
  password: '123456'
}).then(({ data }) => {
  console.log(data.token) // 输出:服务端签发的登录令牌
})

解构出 data 后直接使用返回字段,代码更简洁。

在组件中加载列表

配合 Vue3 的响应式数据与生命周期钩子,把请求封装成 async 函数:

import { ref, onMounted } from 'vue'
import axios from 'axios'

const list = ref([])                  // 响应式列表

async function loadList() {
  const { data } = await axios.get('/api/articles')
  list.value = data                   // 更新后页面自动渲染
}

onMounted(loadList)                   // 组件挂载后发起请求

页面加载完成自动调用 loadList,数据返回后模板中的 v-for 立即刷新出列表。

拦截器统一处理

登录令牌、统一错误提示等公共逻辑适合放在拦截器里:

// 请求前自动携带令牌
axios.interceptors.request.use((config) => {
  config.headers.Authorization = localStorage.getItem('token')
  return config
})

// 响应后统一处理错误
axios.interceptors.response.use(
  (res) => res,
  () => Promise.reject(new Error('网络异常,请稍后重试'))
)

请求拦截器负责「加料」,响应拦截器负责「善后」,业务代码因此干净许多。

小结

axios 用简洁的 Promise 语法封装了 Ajax,配合 async/await 让代码像同步一样好读。掌握 GET、POST 与拦截器之后,就可以在组件里自由读写后端数据了。

笔记加载中…