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

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

前言


最近老是做后台项目,很多页面需要同时请求多个数据,并且为了统一 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 的关闭方法。


import { debounce } from "lodash";
const closeLoading = debounce(() => {
  if (!RequestStack.length) {
    loadingInstance && loadingInstance.close();
    loadingInstance = null
  }
}, 100);


只有当此时的请求数组的长度为 0 的时候,才关闭 Loading 效果。


因为在 Node 的模块环境下,一个 js 文件就相当于一个模块,只要没有导出,内部的变量就是相对安全的;所以 RequestStack 的操作和长度基本不会被外界改变,可以确保该数组长度就是请求中的 http 请求个数;当长度为 0 时,那肯定就是没有 http 请求,需要关闭 Loading 了。


而增加防抖操作,也是为了避免有些同步请求的操作导致的闪烁。


最后,就是增加 axios 的拦截器配置,在发起时向数组中插入一个元素,在结束时(异常、正常等)删除一个元素,并调用 closeLoading 关闭加载效果。


// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  // 开启 Loading
  if (config.fullscreen) {
    !loadingInstance && (loadingInstance = Loading.service(LoadingOpts))
    RequestStack.push(RequestId++);
  }
  return config;
}, function (error) {
  // 发生错误时清除一个元素
  RequestStack.pop();
  closeLoading();
  return Promise.reject(error);
});
// 添加响应拦截器,不管成功还是失败都需要关闭 loading
axios.interceptors.response.use(function (response) {
  RequestStack.pop();
  closeLoading();
  return response;
}, function (error) {
  RequestStack.pop();
  closeLoading();
  return Promise.reject(error);
});


3. 总结


总的来说,这个方案原理很简单:通过闭包来实现多个请求时数量的统一和 CloseLoading 的正确时机。但是也有一些问题,比如有些大数据请消耗大量时间,或者请求间隔大于100ms,一样有可能影响用户体验,实际的加载动画效果依然要根据项目情况来进行调整。


目录
相关文章
|
13天前
|
前端开发 JavaScript 开发者
前端 CSS 优化:提升页面美学与性能
前端CSS优化旨在提升页面美学与性能。通过简化选择器(如避免复杂后代选择器、减少通用选择器使用)、合并样式表、合理组织媒体查询,可减少浏览器计算成本和HTTP请求。利用硬件加速和优化动画帧率,确保动画流畅。定期清理冗余代码并使用缩写属性,进一步精简代码。这些策略不仅加快页面加载和渲染速度,还提升了视觉效果,为用户带来更优质的浏览体验。
|
2月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
2月前
|
缓存 前端开发 JavaScript
利用代码分割优化前端性能:策略与实践
在现代Web开发中,代码分割是提升页面加载性能的有效手段。本文介绍代码分割的概念、重要性及其实现策略,包括动态导入、路由分割等方法,并探讨在React、Vue、Angular等前端框架中的具体应用。
|
3天前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
1月前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
96 3
|
2月前
|
前端开发 安全 UED
2024年前端性能优化新策略
2024年前端性能优化策略涵盖代码分割与环境变量管理。代码分割通过动态导入和按需加载CSS减少初始加载时间;环境变量管理则确保敏感信息安全,简化多环境配置。结合最新工具和技术,可大幅提升Web应用性能与用户体验。
|
1月前
|
缓存 监控 前端开发
探索前端性能优化:关键策略与代码实例
本文深入探讨前端性能优化的关键策略,结合实际代码示例,帮助开发者提升网页加载速度和用户体验,涵盖资源压缩、懒加载、缓存机制等技术。
|
2月前
|
搜索推荐 前端开发 定位技术
前端开发人员SEO优化技术方案
不同的搜索引擎提供了服务后台常见功能来优化网站搜索
55 2
|
2月前
|
前端开发 JavaScript 搜索推荐
前端懒加载:提升页面性能的关键技术
前端懒加载是一种优化网页加载速度的技术,通过延迟加载非首屏内容,减少初始加载时间,提高用户访问体验和页面性能。
|
2月前
|
数据采集 缓存 监控
如何优化前端框架的数据驱动方式以提高性能?
综上所述,通过多种手段的综合运用,可以有效地优化前端框架的数据驱动方式,提高应用的性能,为用户带来更好的体验。同时,随着技术的不断发展和进步,我们需要不断探索和创新,以找到更适合的优化方法和策略。

热门文章

最新文章

  • 1
    JavaScript 使用axios库发送 post请求给后端, 给定base64格式的字符串数据和一些其他参数, 使用表单方式提交, 并使用onUploadProgress显示进度
    528
  • 2
    若依修改,若依如何发送请求---王清江07,axios的请求在request.js文件中,若依发送GET请求,必须用param
    224
  • 3
    axios发送post请求,如何接受和返回一个axios的字段,解决bug的方法,困难的事情先从简单做起,先从发送一个axios的post请求做起,解决方法查别人的资料,查看F12看network就行
    52
  • 4
    文本,前后端数据交互,简单请求,如何去给data数据赋值,在mounted()里赋值,利用axios发送的请求,res就是数据集,就是后端的数据,this.users = res.data.data
    52
  • 5
    Request failed with status code 400,使用axios.post要发送参数,认真比对原项目,看看有没有忘记什么?
    122
  • 6
    vue3 在 watchEffect 里中断未完成的 axios 请求(只保留最后一次请求的方法---连续点击查询按钮的优化)
    152
  • 7
    前后端数据交互.js文件的axios的写法,想要往后端发送数据,页面注入API,await的意思是同步等待服务器数据,并返回,axios注入在其他页面,其他页面调用的时候,同步作用
    60
  • 8
    前后端数据交互,API风格组合式API和选项式API,setup是一个标识,组合式编写的意思,使定义count.value的值自增的写法,组合式API使用axios的写法,ref定义响应数据写法
    38
  • 9
    网页设计,若依项目修改(It must be done)02------axios封装后发get请求,axios请求的位置在呢?
    54
  • 10
    前后端数据交互之axios的路径怎样找?axios的路径是那个,是你打开Tomcat之后,出现的路径+你项目写的接口路径
    52