axios 配置loading_axios进阶之路——封装篇

本文档介绍如何基于axios进行请求封装,包括创建请求管理文件夹、统一接口管理、请求实例封装以及在Vue中挂载和使用。通过封装,实现了请求的高效管理和便捷调用,同时为添加loading功能提供了基础。
摘要由CSDN通过智能技术生成

一、 封装前准备

在前两篇讲过了axios的安装、基本配置、拦截器使用,如下:

  • axios进阶之路——基础篇

  • axios进阶之路——拦截器篇

那么本篇的封装也是基于前两篇的基础之上进行的。

二、 开拔

1. 新建文件夹

在 src目录下新建文件夹,用于存放所有请求列表和请求封装的js。如

├── src

│ ├── service // ++ 新建文件夹

│ │ ├── http.js // ++ 用于封装请求

│ │ ├── apiList.js // ++ 存放请求路径

│ ├── page

│ │ ├── Home.vue // 主页组件

│ ├── router

│ │ ├── index.js

│ ├── App.vue

│ ├── main.js

2. 所有接口请求的统一管理

一般情况下,一个项目的所有请求都会由一个统一的基础路径加上不同的接口路径和接口名组成,并且大部分接口都会有统一的请求或者响应处理,例如返回不同code值,要做响应处理,如果把所有接口都单独处理可谓是资源的极大浪费,因此想办法统一管理。在上一步中,已经新建了一个名为 service的文件夹,包含两个js文件:

  • apiList.js:存放请求路径

  • http.js:封装请求

先看第一个: apiList,就是用来将所有接口统一管理的。例如:

// 定义请求列表对象API_LIST,其下每个请求(对象)包含请求方法与请求路径两项

const API_LIST = {

// get请求

getData1: {

method: 'get',

url: '/xx/getData1'

},

// post请求

getData2: {

method: 'post',

url: '/xx/getData2'

},

}

// 导出

export default API_LIST

一个项目,特殊接口的话可以单独处理,其余的的所有请求都可以放在这个文件中进行统一管理,之后项目变动找接口修改也会更好维护。

3. 请求封装

在请求接口列表处理得当之后,就该在请求实例上做文章了。一般需要处理两个问题:一是走请求,二是拦截器处理。 尽可能加上注释的提供一份参考

// http.js

// 引入axios

import axios from 'axios'

// 引入刚才封装的请求接口列表

import api_list from './api/api_list'

// 吐司框组件,配合拦截器使用,可自行处理(不要也行)

import Toast from 'xxx'

// 路由设置,配合拦截器使用,可不要

import Router from '../router/index'

// baseUrl判断

let baseURL;

// 如果是开发环境,用本地baseURL,如果是生产环境用线上baseURL

if(process.env.NODE_ENV === 'development') {

baseURL = 'http://{本地地址}/xxx';

} else if(process.env.NODE_ENV === 'production') {

baseURL = 'https://{线上地址}/xxx';

}

// 实例

let instance = axios.create({

baseURL: baseURL, // url判断

timeout: 15000 // 超时时间设置

})

const Http = {}; // 用来包裹请求的容器

// 遍历接口列表

for(let key in api_list) {

let api = api_list[key]; // 每一项api都包含method, url

Http[key] = async function(

params, // 请求参数

isFormData = true, // 是否是form-data请求

config = {} // 配置参数

) {

let newParams = {}; // 参数容器

// content-type 参数转换

// 如果需要form-data请求,则格式化为form-data,一般用于post请求

if(params && isFormData) {

newParams = new FormData();

for(let key in params) {

newParams.append(key, params[key])

}

} else {

// 一般用于get请求

newParams = params;

}

// 返回值容器

let res = {};

// 不同请求判断

if(api.method === 'post') {

// post请求处理

try{

res = await instance[api.method](api.url, newParams, config);

} catch(err) {

res = err;

}

} else if(api.method === 'get') {

// get请求处理

config.params = newParams;

try{

res = await instance[api.method](api.url, config);

} catch(err) {

res = err;

}

}

// 返回返回值

return res;

}

}

// 请求拦截器

instance.interceptors.request.use(req => {

// 吐司:loading框加载,不要也行

Toast.loading({

message: '加载中...',

forbidClick: true,

loadingType: 'spinner'

});

return req;

}, err => {

// 请求错误

Toast.clear(); // 清除吐司

Toast.fail('请求失败,请稍后重试');

})

// 响应拦截器

instance.interceptors.response.use(res => {

Toast.clear(); // 清除吐司

// 不同的返回值跳相应路由即可,如201跳登陆,202跳加载失败等,根据需求自行处理

if(res.data.code === 201) {

Router.push('/login')

} else if(res.data.code === 202) {

Router.push('/loadfail')

} else {

// ...

}

// 返回返回值,返回值为res.data

return res.data

}, err => {

Toast.clear(); // 清除吐司

Toast.fail('无响应,请稍后重试');

})

// 导出请求

export default Http

4. 使用

封装完成,盘他!

4.1 挂载到vue实例上

// main.js

import Vue from 'vue'

// 引入

import Http from './service/http'

// Vue 实例挂载

Vue.prototype.$Http = Http

// ...

4.2 测试使用

在某个vue文件中:

export default {

data() {

return {

data: {}

}

},

methods: {

// 获取get请求数据,注意async和await配对使用

async getData1() {

let res = await _this.$Http.getData1({

id: 'xxx',

token: 'xxx'

}, false); // false代表不是formdata格式

if(res.code === 200) {

alert('get数据返回成功');

}

},

// 获取post请求数据,注意async和await配对使用

// 此处是formdata格式,第二个参数可写true,因为默认为true,因此可以不写

async getData2() {

let res = await this.$Http.getData2({

id: 'xxx',

token: 'xxx'

});

if(res.code === 200) {

alert('post数据返回成功');

}

},

},

mounted() {

this.getData1();

this.getData2();

},

}

经测试,普通格式(非文件等)请求有效,简单封装完成~

三、 完结撒花~

一般接口的请求封装完毕,用到了基于axios的一些知识,记录至此。在项目中灵活运用,相比于一个个接口单独处理,可谓是大幅度的提升哟~ 另外,基于此,也可配合proxy(在vue.config.js中配置)处理跨域问题,就不在此处赘述了。

以上。

05efe9eee011125dfebb2689f188d30d.png

往期精彩回顾

axios进阶之路——基础篇

axios进阶之路——拦截器篇

在Vue 3中使用TypeScript封装axios并包含loading功能的步骤如下: 1. 首先,安装axios和@types/axios依赖: ``` npm install axios @types/axios ``` 2. 创建一个名为api.ts的文件,用于封装axios请求和loading功能: ```typescript import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'; import { reactive } from 'vue'; // 创建一个loading对象,用于控制loading状态 const loading = reactive({ isLoading: false, }); // 创建一个axios实例 const instance = axios.create({ baseURL: 'https://api.example.com', // 设置请求的基础URL timeout: 5000, // 设置请求超时时间 }); // 请求拦截器,在发送请求之前执行 instance.interceptors.request.use( (config: AxiosRequestConfig) => { loading.isLoading = true; // 开启loading状态 return config; }, (error) => { loading.isLoading = false; // 关闭loading状态 return Promise.reject(error); } ); // 响应拦截器,在接收到响应之后执行 instance.interceptors.response.use( (response: AxiosResponse) => { loading.isLoading = false; // 关闭loading状态 return response.data; }, (error) => { loading.isLoading = false; // 关闭loading状态 return Promise.reject(error); } ); // 封装get请求方法 export const get = async <T>(url: string, config?: AxiosRequestConfig): Promise<T> => { try { const response = await instance.get<T>(url, config); return response; } catch (error) { throw new Error(error); } }; // 封装post请求方法 export const post = async <T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> => { try { const response = await instance.post<T>(url, data, config); return response; } catch (error) { throw new Error(error); } }; export default { loading, }; ``` 3. 在Vue组件中使用封装axiosloading功能: ```vue <template> <div> <button @click="fetchData">Fetch Data</button> <div v-if="api.loading.isLoading">Loading...</div> <div v-else>{{ data }}</div> </div> </template> <script> import { ref } from 'vue'; import api from './api'; export default { setup() { const data = ref(''); const fetchData = async () => { try { const response = await api.get<string>('/data'); data.value = response; } catch (error) { console.error(error); } }; return { fetchData, data, ...api, }; }, }; </script> ``` 在上述代码中,我们通过`api.ts`文件封装axios的get和post请求方法,并使用`reactive`创建了一个loading对象来控制loading状态。在Vue组件中,我们可以直接调用`api.get`或`api.post`方法来发送请求,并通过`api.loading.isLoading`来控制loading的显示与隐藏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值