前端基础向~封装Axios优化页面Loading效果

本文介绍如何在前端项目中通过封装Axios并在拦截器中利用防抖技术,实现全屏Loading效果,避免请求间隔导致的闪烁。目标是在请求开始时开启Loading,结束时关闭,并确保在所有请求完成后关闭。方案包括使用自增ID,维护请求数组,通过数组长度判断请求状态,以及应用lodash的debounce防抖函数。总结中提到,虽然简单有效,但还需针对不同项目调整加载动画以优化用户体验。

前言

最近老是做后台项目,很多页面需要同时请求多个数据,并且为了统一 loading 样式和加载效果、避免多个请求发起和结束之间有细微间隔导致 loading 闪烁的情况,所以就改造了一下 Axios 的封装,在拦截器中增加全屏 Loading 的处理。

1. 目标效果

根据目前的项目需求,总结了以下场景和对应要求:

  • 在请求时开启 Loading 效果,请求结束时关闭;* 如果有多个请求,则尽量保证多个请求间隔不会存在闪烁,也不会添加多个 Loading 效果;* 可以配置是否开启全屏 Loading第一眼看到这个需求,就想到的肯定有防抖,用来实现一个时延效果,避免首次加载时可能出现的闪烁;但是在第一次请求开启 Loading 之后如何保证在关闭时就是最晚结束的请求呢?

这里我采用的方案就是通过一个数组长度来控制。

2. 方案实现

首先,是编写一个 request.js 文件,引入 Axios 和 ElementUI 的 Loading 组件,并初始化一个数组和 loading 组件实例。

import axios from "axios";
import { Loading } from "element-ui";

let loadingInstance;
const LoadingOpts = {text: "加载中,请稍后......"
};

const RequestStack = [];
let RequestId = 0; // 也可以不用 

这里我定义了一个自增式的ID,用来标识当前的请求,也可以取消,对实际逻辑没有影响。

然后,我们再通过 lodash 提供的 debounce 防抖函数,封装一个 Loading 的关闭方法。


                
### 封装 Axios GET 请求的方法 在前端开发中,对 `axios` 库的 GET 请求进行封装是一种常见的做法。通过封装可以提高代码的可维护性和复用性[^1]。以下是几种常用的封装方式: #### 1. 基础封装:统一处理请求参数和错误 将通用逻辑(如默认 URL、错误处理等)集中到一个函数中,以减少重复代码。 ```javascript import axios from 'axios'; const instance = axios.create({ baseURL: 'http://localhost/api', // 设置基础URL timeout: 5000, // 超时时间 }); // GET请求封装函数 function get(url, params) { return instance.get(url, { params }) .then(response => response.data) .catch(error => { console.error('GET请求失败:', error); throw error; }); } export default get; ``` 该方法通过创建一个带有基础配置的 `axios` 实例,并定义了一个通用的 `get` 函数用于发送 GET 请求,统一处理响应数据和错误信息[^2]。 #### 2. 高阶封装:结合拦截器增强功能 使用 `axios` 提供的拦截器机制,在请求或响应阶段执行额外操作,例如添加认证头、日志记录等。 ```javascript import axios from 'axios'; import qs from 'qs'; // 用于序列化参数 const instance = axios.create({ baseURL: '/api', timeout: 5000, }); // 请求拦截器 instance.interceptors.request.use(config => { if (config.method === 'get') { config.paramsSerializer = params => { return qs.stringify(params, { arrayFormat: 'repeat' }); // 支持数组参数 }; } return config; }, error => Promise.reject(error)); // 响应拦截器 instance.interceptors.response.use(response => { return response.data; }, error => { console.error('响应错误:', error); return Promise.reject(error); }); // 导出GET请求函数 function get(url, params) { return instance.get(url, { params }); } export default get; ``` 此封装方式利用了 `axios` 的拦截器功能,可以在请求发出前修改配置(如参数格式化),并在响应返回后统一处理结果或错误[^3]。 #### 3. 模块化封装:按业务划分API接口 针对大型项目,建议按照不同的业务模块来组织 API 接口,使代码结构更清晰。 ```javascript // userApi.js import get from './http'; // 引入封装好的GET请求函数 // 获取用户列表 export const getUserList = (params) => { return get('/users', params); }; // 获取单个用户信息 export const getUserById = (id) => { return get(`/user/${id}`); // 支持路径参数 }; ``` 这种方式将不同业务逻辑相关的网络请求分门别类地放在各自的文件中,便于管理和维护[^4]。 #### 4. 统一异常处理与加载状态管理 为提升用户体验,可以在封装过程中加入全局错误提示及加载动画控制等功能。 ```javascript import axios from 'axios'; import { startLoading, endLoading } from './loading'; // 自定义加载状态管理 const instance = axios.create({ baseURL: '/api', timeout: 5000, }); instance.interceptors.request.use(config => { startLoading(); // 开始加载动画 return config; }, error => { endLoading(); // 结束加载动画 return Promise.reject(error); }); instance.interceptors.response.use(response => { endLoading(); // 结束加载动画 return response.data; }, error => { endLoading(); // 结束加载动画 alert('网络异常,请稍后再试!'); // 全局错误提示 return Promise.reject(error); }); function get(url, params) { return instance.get(url, { params }); } export default get; ``` 以上示例展示了如何通过拦截器实现加载状态管理和全局错误提示,从而提供更好的交互体验[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值