Vue3中使用axios
Promise介绍
所谓Promise,简单说就是一个容器,里面保存看某个未来才会结束的事件(通常是一个异步操作)的结果。从
语法上说,Promise是一入对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理
同步代码与异步代码
安装并引入axios
npm install axios
此时package.json里面就多了axios依赖
引入axios
获取数据
Axios GET参数构成:axios.get(url,{config{},…{}…})
-
url:
- 字符串:目标服务器的地址,如
https://api.example.com/resource
。
- 字符串:目标服务器的地址,如
-
config (可选):
-
配置对象,用于设置请求的具体行为。常用的配置项包括:
-
params: URL 查询参数,将其序列化为查询字符串并附加到请求 URL。例如:
params: { userId: 1, sort: 'asc' }
-
headers: 自定义请求头,例如 Authorization 头:
headers: { 'Authorization': 'Bearer YOUR_TOKEN' }
-
timeout: 请求超时的时间,单位为毫秒。
timeout: 5000 // 5秒超时
-
responseType: 指定响应类型(如 'json', 'text', 'blob', 'arraybuffer', 'document')。
-
withCredentials: 指定是否跨域请求时是否需要使用凭证(如 Cookies)。
-
validateStatus: 自定义请求状态码的成功范围。默认情况下,2xx 状态码会被视为成功。
-
// 以下是个获取url里数据的函数
const getStudent = async () => { // await用在函数里面要在函数前面加async// 也可以用结构来承接axios返回数据const x = await axios.get('http://geek.itheima.net/v1_0/channels')// axios要配合await使用console.log(x);count.value = x.data.data.arrays // 把axios获取的数据赋值给前面的变量}
调用该函数后就得到了url里面的数据
await会暂停函数执行:当执行到await
表达式时,函数的执行会被暂停,直到Promise解决(resolved)或拒绝(rejected)。
在 Vue 3 中,使用 Axios 进行数据请求通常是放在 onMounted
生命周期钩子中。这个钩子会在组件实例被挂载后立即调用,非常适合进行初始数据获取。如果是点按钮来获取并渲染,就不用放在OnMounted函数里
onMounted(() => {
// 在组件挂载后执行的代码
});
<script setup>
import { useStudentStore } from '@/store';
import { onMounted } from 'vue';
const StudentStore = useStudentStore()
// 在组件挂载完成后调用getStudent(),就是要放在onMounted(() => {<fun>})里
onMounted(() => {StudentStore.getStudent()
})
</script><template><h1>这是son2</h1><ul><li v-for="(item, index) in StudentStore.prince" :key="index">{{ index + 1 }} {{ item }}</li></ul></template>
发送数据
Axios POST 请求参数结构:axios.post(url, data,{config{},…{}…})
-
url:
- 字符串:目标服务器的地址,如
https://api.example.com/resource
。
- 字符串:目标服务器的地址,如
-
data(传得较多):
- 对象:将被作为请求体发送到服务器的数据。内容可以是任意数据类型(对象、数组、基本数据类型等),通常是 JSON 格式的对象。
示例:
{ name: 'Alice', age: 30 }
-
config (可选):
- 配置对象,用于设置请求的具体行为。常用的配置项包括:
- headers: 自定义请求头。
headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer TOKEN' }
- timeout: 请求超时的时间,单位是毫秒。
timeout: 1000 // 一秒超时
- params: URL 查询参数,会自动拼接到 URL 中。
params: { userId: 1 }
- responseType: 指定响应类型。
responseType: 'json' // 默认是 json
- validateStatus: 自定义请求状态码的成功范围。默认情况下,2xx 状态码会被视为成功。
validateStatus: function (status) { return status >= 200 && status < 500; // 只接收 2xx 和 4xx 状态码 }
const postfeedback = async() => {console.log(advice.value); // advice对象变量在函数外定义好,并用v-model与输入框绑定// 发送post请求并获得响应const resp = await axios.post('https://hmajax.itheima.net/api/feedback', advice.value)// await会暂停函数执行:当执行到await表达式时,函数的执行会被暂停,直到Promise解决(resolved)或拒绝(rejected)。alert(resp.data.message); // 后端发送的响应数据}
axios拦截器
token介绍:
在Vue 3中,使用axios拦截器可以帮助我们在请求发送之前或响应到达之后执行一些操作。这些操作可以包括设置请求头、处理错误、统一管理跳转等。
如何使用axios拦截器:
1. 请求拦截器:在请求发送之前执行,可以用来修改请求配置或添加额外的逻辑,例如添加token验证信息。
import axios from 'axios';axios.interceptors.request.use(config => {// 在这里添加token或其他配置const token = localStorage.getItem('token');if (token) {config.headers['Authorization'] = `Bearer ${token}`;}return config;},error => {return Promise.reject(error); //会捕获错误并返回一个拒绝的 Promise});
2. 响应拦截器:在响应到达之后执行,可以用来处理响应数据或进行错误处理。
axios.interceptors.response.use(response => {// 对响应数据进行处理return response.data;},error => {// 对响应错误进行处理if (error.response && error.response.status === 401) {// 处理401错误,例如跳转到登录页面}return Promise.reject(error);});
3. 移除拦截器:如果需要移除拦截器,可以使用`eject`方法。
const myInterceptor = axios.interceptors.request.use(...);axios.interceptors.request.eject(myInterceptor);
4. 在Vue 3项目中设置axios实例:通常我们会创建一个axios实例,并在项目中全局使用。
// src/axios/index.jsimport axios from 'axios';const instance = axios.create({baseURL: 'http://your-api-url',timeout: 1000,});// 添加拦截器instance.interceptors.request.use(...);instance.interceptors.response.use(...);export default instance;
5. 在main.js中引入axios实例:
import { createApp } from 'vue';import App from './App.vue';import axios from './axios'; // 引入封装的axios实例const app = createApp(App);app.config.globalProperties.$axios = axios; // 将axios挂载到全局app.mount('#app');
6. 在组件中使用:
import { ref } from 'vue';export default {setup() {const data = ref(null);const error = ref(null);const fetchData = async () => {try {data.value = await this.$axios.get('/data');} catch (err) {error.value = err;}};fetchData();return { data, error };}}
通过上述步骤,你可以在Vue 3项目中灵活地使用axios拦截器来处理HTTP请求和响应。这样不仅可以简化代码,还可以提高项目的可维护性。
vue3中组合式API封装axios
在Vue 3中使用组合式API封装Axios,可以创建一个可复用的axios模块,这样可以在多个组件中轻松地使用相同的Axios配置和请求方法。以下是封装Axios的步骤:
1. 创建Axios实例
首先,创建一个Axios实例并配置通用的设置,如基础URL、超时时间、请求拦截器和响应拦截器。
如果是工程化封装axios,那么要在src文件夹下创建api文件夹,里面包含index.js(封装axios请求函数)和path.js(管理url地址)。在src文件夹下创建utils文件夹,里面包含配置axios(包含拦截器)的requset.js文件,导出封装好的axios并在api里封装axios函数
// src/utils/axios.js
import axios from 'axios';const axiosInstance = axios.create({baseURL: 'https://api.example.com',timeout: 10000, // 超时时间
});// 请求拦截器
axiosInstance.interceptors.request.use(config => {// 在发送请求之前做些什么,例如设置token、将数据转为JSON格式等config.headers['Authorization'] = 'Bearer your-token';return config;},error => {// 对请求错误做些什么return Promise.reject(error);}
);// 响应拦截器
axiosInstance.interceptors.response.use(response => {// 对响应数据做点什么return response.status === 200 ? Promise.reslove(response) : Promise.reject(response)},error => {// 对响应错误做点什么return Promise.reject(error);}
);export default axiosInstance;
config
对象包含了即将发送的HTTP请求的所有配置信息,包括method、headers、params、data等。这个对象是Axios请求配置的完整表示,你可以在拦截器中访问和修改它,以影响请求的行为。
error
参数是一个函数,它在请求配置(config
)准备过程中发生错误时被调用。这个错误处理函数接收一个错误对象作为参数,你可以在这个函数中定义错误处理逻辑。
config.headers['Authorization'] = 'Bearer your-token';:这是设置HTTP请求头中的Authorization
字段,通常用于在HTTP请求中提供身份验证信息。在这种格式中,'Bearer your-token'
是一个认证方案,它告诉服务器使用Bearer令牌(一种常用的令牌类型)来进行身份验证。
Axios 请求拦截器通常在发送请求之前可以做以下几件事情:
1. 添加请求头:可以在请求拦截器中添加认证令牌(如 JWT)或其他自定义请求头。
axios.interceptors.request.use(config => {config.headers['Authorization'] = `Bearer ${token}`;return config;});
2. 修改请求参数:可以对请求的参数进行修改,比如转化数据格式、添加或删除某些字段等。
axios.interceptors.request.use(config => {config.data = { ...config.data, extraParam: 'value' };return config;});
3. 显示加载状态:在请求开始时,可以显示一个加载动画或提示,以提高用户体验。
axios.interceptors.request.use(config => {// 显示加载状态loadingIndicator.show();return config;});
4. 错误处理:虽然主要在响应拦截器中处理错误,但也可以在请求拦截器中对请求的参数进行校验,如果参数不符合要求,可以直接返回一个错误。
axios.interceptors.request.use(config => {if (!config.data.requiredField) {return Promise.reject(new Error('Required field is missing'));}return config;});
5. 记录请求日志:可以在请求发送之前记录日志,帮助调试和监控。
axios.interceptors.request.use(config => {console.log('Request made with: ', config);return config;});
拦截器的功能非常强大,能够集中管理与请求相关的逻辑,提高代码的可维护性和可读性。
拦截器中error
error
表示请求拦截器或响应拦截器中的错误对象,用于描述请求过程中发生的错误。
作用
在响应拦截器中,如果请求失败,则会传递这个 error
对象,用于处理错误(如记录日志、显示错误信息、重定向等)。
console.error("请求失败:", error):error
是捕获的错误对象,用于在控制台中输出详细的错误信息,帮助开发者了解请求失败的原因。
示例代码
下面是一个包含请求拦截器的示例,其中包括了error
的使用:
import axios from 'axios';// 创建axios实例
const instance = axios.create({baseURL: 'https://api.example.com',timeout: 1000,
});// 添加请求拦截器
instance.interceptors.request.use(config => {// 在发送请求之前做些什么config.headers.Authorization = 'Bearer your-token';return config;},error => {// 对请求配置错误做些什么console.error('请求配置错误:', error);// 专门用于输出错误信息,旨在标识问题或异常情况。// 输出的错误信息通常以红色字体显示,更加突出,以便引起开发者的注意。// 可以在这里进行一些错误处理,例如提示用户alert('请求配置失败,请检查网络设置');// 抛出错误,阻止请求发送return Promise.reject(error);}
);export default instance;
在这个示例中,如果请求配置过程中发生错误,拦截器会打印错误信息到控制台,并弹出一个警告框提示用户。然后,使用Promise.reject
抛出错误,这样请求就不会被发送。
Promise.reject(error)
是一个 JavaScript 方法,用于创建并返回一个状态为“拒绝”(rejected)的 Promise,其中 error
是拒绝的原因。
2. 创建Axios模块
然后,创建一个模块来封装Axios的常用方法,如get
、post
等。
// src/utils/http.js
import axios from './axios';const http = {get(url, params = {}) {return axios.get(url, { params });},post(url, data = {}) {return axios.post(url, data);},// 可以继续添加其他方法,如 put, delete 等
};export default http;
3. 在组件中使用封装的Axios
在组件中,你可以导入封装的Axios模块,并在setup
函数中使用它。
// src/components/SomeComponent.vue
<template><div><h1>用户信息</h1><p>{{ userInfo }}</p></div>
</template><script>
import { ref, onMounted } from 'vue';
import http from '@/utils/http';export default {setup() {const userInfo = ref(null);const fetchUserInfo = () => {http.get('/user/info').then(data => {userInfo.value = data;}).catch(error => {console.error('请求失败:', error);});};onMounted(fetchUserInfo);return {userInfo,};},
};
</script>
4. 提供全局Axios实例(可选)
如果你希望在应用的任何地方都能方便地访问Axios实例,可以在应用的入口文件中提供它。
// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import axiosInstance from './utils/axios';const app = createApp(App);app.config.globalProperties.$axios = axiosInstance; // 将axios添加到全局属性中app.mount('#app');
这样,你可以在任何组件中通过this.$axios
访问Axios实例。
5. 使用Provide/Inject提供Axios实例(可选)
你还可以使用Vue的provide/inject API来提供Axios实例,使其在应用程序的特定部分可用。
// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import axiosInstance from './utils/axios';const app = createApp(App);app.provide('axios', axiosInstance); // 提供axios实例app.mount('#app');
然后在需要的组件中注入它:
import { inject } from 'vue';export default {setup() {const axios = inject('axios');const userInfo = ref(null);const fetchUserInfo = () => {axios.get('/user/info').then(response => {userInfo.value = response.data;}).catch(error => {console.error('请求失败:', error);});};onMounted(fetchUserInfo);return {userInfo,};},
};
通过这种方式,你可以在Vue 3项目中封装并复用Axios,使得网络请求更加方便和一致。