Vue 中 axios 的超详细介绍

鼠扑  论坛元老 | 2025-3-16 11:36:56 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 2014|帖子 2014|积分 6042

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、axios 的根本概念和安装

1.1 什么是 axios

Axios 是一个基于 promise 的 HTTP 库,可以用来发送网络请求。它可以在浏览器和 node.js 中使用,本质上是对原生 XMLHttpRequest 的封装,符合最新的 ES 规范,支持 Promise API,能够拦截请求和响应,转换请求和响应数据,取消请求,自动转换 JSON 数据等。
1.2 安装 axios

在 Vue 项目中,可以通过 npm 安装 axios:
  1. npm install axios
复制代码
二、axios 的根本使用

2.1 GET 请求

GET 请求用于获取数据,请求指定的信息,返回实体对象。可以携带参数,有两种方式:
方式一:直接在 URL 中携带参数
  1. axios.get("http://localhost:3000/list?id=1").then(
  2.   (res) => {
  3.     console.log(res.data);
  4.   },
  5.   (err) => {
  6.     console.log(err);
  7.   }
  8. );
复制代码
方式二:使用 params 配置对象
  1. axios
  2.   .get("http://localhost:3000/list", {
  3.     params: {
  4.       id: 2,
  5.     },
  6.   })
  7.   .then((res) => {
  8.     console.log(res.data);
  9.   })
  10.   .catch((err) => {
  11.     console.log(err);
  12.   });
复制代码
2.2 POST 请求

POST 请求用于向指定资源提交数据,例如表单提交或文件上传。
  1. axios
  2.   .post("http://localhost:3000/list", {
  3.     name: "蜘蛛精",
  4.     age: 200,
  5.     address: "盘丝洞",
  6.   })
  7.   .then((res) => {
  8.     console.log(res.data);
  9.   })
  10.   .catch((err) => {
  11.     console.log(err);
  12.   });
复制代码
2.3 PUT 请求

PUT 请求用于更新数据,从客户端向服务器传送的数据代替指定的文档的内容。会把更新的数据完全替代原数据,如果只修改了部门的数据,原数据其他内容都会丢失。
  1. axios
  2.   .put("http://localhost:3000/list/1", {
  3.     name: "玉皇大帝",
  4.   })
  5.   .then((res) => {
  6.     console.log(res.data);
  7.   })
  8.   .catch((err) => {
  9.     console.log(err);
  10.   });
复制代码
2.4 PATCH 请求

PATCH 请求用于对已知资源举行局部更新。
  1. axios
  2.   .patch("http://localhost:3000/list/2", {
  3.     name: "王母娘娘",
  4.   })
  5.   .then((res) => {
  6.     console.log(res.data);
  7.   })
  8.   .catch((err) => {
  9.     console.log(err);
  10.   });
复制代码
2.5 DELETE 请求

DELETE 请求用于请求服务器删除指定的数据。
  1. axios
  2.   .delete("http://localhost:3000/list/1")
  3.   .then((res) => {
  4.     console.log(res.data);
  5.   })
  6.   .catch((err) => {
  7.     console.log(err);
  8.   });
复制代码
三、axios 的配置

3.1 全局配置

全局配置是对所有请求都见效的配置,例如设置全局的超时时长和根本 URL:
  1. axios.defaults.timeout = 2000;
  2. axios.defaults.baseURL = "http://localhost:3000";
复制代码
3.2 实例配置

在项目中,可以创建多个 axios 实例,每个实例可以有不同的配置:
  1. // 创建实例时配置
  2. let instance = axios.create({
  3.   baseURL: "http://localhost:3000",
  4.   timeout: 2000,
  5. });
  6. // 创建实例后配置
  7. let instance2 = axios.create();
  8. instance2.defaults.timeout = 2000;
  9. instance2.defaults.baseURL = "http://localhost:3000";
复制代码
3.3 请求配置

请求配置是针对单个请求的配置,例如设置请求的超时时长:
  1. axios
  2.   .get("http://localhost:3000/list", {
  3.     timeout: 2000,
  4.   })
  5.   .then((res) => {
  6.     console.log(res.data);
  7.   })
  8.   .catch((err) => {
  9.     console.log(err);
  10.   });
复制代码
四、axios 的拦截器

拦截器用于在网络请求时,在发起请求大概响应时对操作举行处理,例如发送请求时添加网页加载的动画,或认证 token,逼迫用户先登录再请求数据;响应的时间,可以结束网页加载的动画,大概对响应的数据举行处理。
4.1 请求拦截器

  1. axios.interceptors.request.use(
  2.   (config) => {
  3.     // 发生请求前的一系列的处理
  4.     console.log("开启加载动画");
  5.     console.log("认证是否有 token,如果没有,要去登录");
  6.     return config; // 拦截后的放行
  7.   },
  8.   (err) => {
  9.     // 请求错误处理
  10.     return Promise.reject(err);
  11.   }
  12. );
复制代码
4.2 响应拦截器

  1. axios.interceptors.response.use(
  2.   (response) => {
  3.     // 数据回来前的一系列的处理
  4.     console.log("关闭加载动画");
  5.     console.log("对数据进行一些处理");
  6.     return response.data; // 拦截后的放行,返回响应对象中的数据
  7.   },
  8.   (err) => {
  9.     // 响应错误处理
  10.     return Promise.reject(err);
  11.   }
  12. );
复制代码
五、Vue 中 axios 的使用

5.1 在 Vue 原型上配置 $axios

在 Vue 项目的 main.js 文件中引入 axios,并将其放到 Vue 原型上,如许所有 Vue 实例(vm,vc)上都会有 axios:
  1. import axios from "axios";
  2. Vue.prototype.$axios = axios;
复制代码
5.2 在组件中使用 axios

在组件中,可以通过 this.$axios 来发送请求:
  1. <template>
  2.   <div>
  3.     <button @click="getDate">点击发送请求</button>
  4.   </div>
  5. </template>
  6. <script>
  7. export default {
  8.   name: "App",
  9.   methods: {
  10.     async getDate() {
  11.       let res = await this.$axios.get("http://localhost:3000/list");
  12.       console.log(res.data);
  13.     },
  14.   },
  15. };
  16. </script>
复制代码
六、封装 axios

为了提高代码的可维护性和复用性,可以对 axios 举行封装。
6.1 封装 request.js

在 src/utils 目录下创建 request.js 文件,封装 axios:
  1. import axios from "axios";
  2. const request = axios.create({
  3.   baseURL: "http://localhost:3000", // 设置基地址
  4.   timeout: 2000, // 请求超时:当 2s 没有响应就会结束请求
  5. });
  6. // 添加请求拦截器
  7. request.interceptors.request.use(
  8.   function (config) {
  9.     // 发请求前做的一些处理,数据转化,配置请求头,设置 token,设置 loading 等,根据需求去添加
  10.     config.headers = {
  11.       "Content-Type": "application/x-www-form-urlencoded", // 配置请求头
  12.     };
  13.     return config; // 拦截后的放行
  14.   },
  15.   function (error) {
  16.     // 对请求错误做些什么
  17.     return Promise.reject(error);
  18.   }
  19. );
  20. // 添加响应拦截器
  21. request.interceptors.response.use(
  22.   function (response) {
  23.     // 对响应数据做点什么
  24.     console.log("关闭请求数据动画");
  25.     console.log("对数据进行处理");
  26.     return response.data; // 只要响应对象中的数据
  27.   },
  28.   function (error) {
  29.     // 对响应错误做点什么
  30.     return Promise.reject(error);
  31.   }
  32. );
  33. export default request;
复制代码
6.2 在组件中使用封装后的 request

  1. <template>
  2.   <div>
  3.     <button @click="getList">获取列表数据</button>
  4.   </div>
  5. </template>
  6. <script>
  7. import request from "../utils/request";
  8. export default {
  9.   name: "ShowList",
  10.   methods: {
  11.     async getList() {
  12.       let res = await request.get("/list");
  13.       console.log(res);
  14.     },
  15.   },
  16. };
  17. </script>
复制代码
七、二次封装

为了进一步提高代码的可维护性和复用性,可以将请求再次举行封装,创建 API 服务。
7.1 创建 API 服务

在 src/apis 目录下创建 showList.js 文件,导出请求函数:
  1. import request from "@/utils/request";
  2. // 请求 list 数据
  3. export function getListInfo1() {
  4.   return request.get("/list");
  5. }
  6. // 请求 user 数据
  7. export function getUserInfo1() {
  8.   return request.get("/user");
  9. }
复制代码
7.2 在组件中使用 API 服务

  1. <template>
  2.   <div>
  3.     <button @click="getList1">获取列表数据</button>
  4.     <button @click="getUser1">获取用户数据</button>
  5.   </div>
  6. </template>
  7. <script>
  8. import { getListInfo1, getUserInfo1 } from "../apis/showList";
  9. export default {
  10.   name: "ShowList",
  11.   methods: {
  12.     async getList1() {
  13.       let res = await getListInfo1();
  14.       console.log(res);
  15.     },
  16.     async getUser1() {
  17.       let res = await getUserInfo1();
  18.       console.log(res);
  19.     },
  20.   },
  21. };
  22. </script>
复制代码
八、处理跨域问题

在 Vue 项目中,通常会使用署理服务器来解决跨域问题。可以在 vue.config.js 文件中配置署理:
  1. const { defineConfig } = require("@vue/cli-service");
  2. module.exports = defineConfig({
  3.   devServer: {
  4.     proxy: {
  5.       "/api": {
  6.         target: "http://localhost:8000",
  7.         pathRewrite: { "^/api": "" },
  8.         ws: true,
  9.         changeOrigin: true,
  10.       },
  11.     },
  12.   },
  13. });
复制代码
在组件中发送请求时,地址必要修改如下:
  1. axios.get('/api/user').then(
  2.   response => {
  3.     console.log('服务器返回的数据:', response.data);
  4.   },
  5.   error => {
  6.     console.log('错误信息', error.message);
  7.   }
  8. )
复制代码
九、总结

在 Vue 项目中使用 axios 发送网络请求,可以大大提高开发效率和代码的可维护性。通过封装 axios 和配置署理服务器,可以解决跨域问题,而且使代码更加简洁和复用性更高。在实际开发中,可以根据项目需求进一步扩展和优化这些功能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表