Kapture 2018-06-07 at 14.57.40.gif

背景

业务需求是这样子的,每当发请求到后端时就触发一个全屏的 loading,多个请求合并为一次 loading。

现在项目中用的是 vue 、axios、element等,所以文章主要是讲如果使用 axios 和 element 实现这个功能。

分析

首先,请求开始的时候开始 loading, 然后在请求返回后结束 loading。重点就是要拦截请求和响应。

然后,要解决多个请求合并为一次 loading。

最后,调用element 的 loading 组件即可。

拦截请求和响应

axios 的基本使用方法不赘述。笔者在项目中使用 axios 是以创建实例的方式。

// 创建axios实例

const $ = axios.create({

baseURL: `${URL_PREFIX}`,

timeout: 15000

})

然后再封装 post 请求(以 post 为例)

export default {

post: (url, data, config = { showLoading: true }) => $.post(url, data, config)

}

axios 提供了请求拦截和响应拦截的接口,每次请求都会调用showFullScreenLoading方法,每次响应都会调用tryHideFullScreenLoading()方法

// 请求拦截器

$.interceptors.request.use((config) => {

showFullScreenLoading()

return config

}, (error) => {

return Promise.reject(error)

})

// 响应拦截器

$.interceptors.response.use((response) => {

tryHideFullScreenLoading()

return response

}, (error) => {

return Promise.reject(error)

})

那么showFullScreenLoading tryHideFullScreenLoading()要干的事儿就是将同一时刻的请求合并。声明一个变量needLoadingRequestCount,每次调用showFullScreenLoading方法 needLoadingRequestCount + 1。调用tryHideFullScreenLoading()方法,needLoadingRequestCount - 1。needLoadingRequestCount为 0 时,结束 loading。

let needLoadingRequestCount = 0

export function showFullScreenLoading() {

if (needLoadingRequestCount === 0) {

startLoading()

}

needLoadingRequestCount++

}

export function tryHideFullScreenLoading() {

if (needLoadingRequestCount <= 0) return

needLoadingRequestCount--

if (needLoadingRequestCount === 0) {

endLoading()

}

}

startLoading()和endLoading()就是调用 element 的 loading 方法。

import { Loading } from 'element-ui'

let loading

function startLoading() {

loading = Loading.service({

lock: true,

text: '加载中……',

background: 'rgba(0, 0, 0, 0.7)'

})

}

function endLoading() {

loading.close()

}

到这里,基本功能已经实现了。每发一个 post 请求,都会显示全屏 loading。同一时刻的多个请求合并为一次 loading,在所有响应都返回后,结束 loading。

功能增强

实际上,现在的功能还差一点。如果某个请求不需要 loading 呢,那么发请求的时候加个 showLoading: false的参数就好了。在请求拦截和响应拦截时判断下该请求是否需要loading,需要 loading 再去调用showFullScreenLoading()方法即可。

在封装 post 请求时,已经在第三个参数加了 config 对象。config 里包含了 showloading。然后在拦截器中分别处理。

// 请求拦截器

$.interceptors.request.use((config) => {

if (config.showLoading) {

showFullScreenLoading()

}

return config

})

// 响应拦截器

$.interceptors.response.use((response) => {

if (response.config.showLoading) {

tryHideFullScreenLoading()

}

return response

})

我们在调用 axios 时把 config 放在第三个参数中,axios 会直接把 showloading 放在请求拦截器的回调参数里,可以直接使用。在响应拦截器中的回调参数 response 中则是有一个 config 的 key。这个 config 则是和请求拦截器的回调参数 config 一样。

更新:2018-6-7

合并一定间隔时间内请求的 loading

上面的代码已经实现了将有时间重合的 loading 合并,什么意思呢?请看下图

image.png

在 request1 的 loading 还没结束时,request2 的 loading 已经开始。这种情况 request1 和 request2 在时间上有一定的重合,所以 loading 可以合并。

那么 request3 是在 request2 结束后 100ms 开始 loading.这时你会发现 loading 两次,并且中间有一次极短的闪烁,这当然是很不好的体验了。

我们只需要修改 tryHideFullScreenLoading 即可:

export function tryHideFullScreenLoading() {

if (needLoadingRequestCount <= 0) return

needLoadingRequestCount--

if (needLoadingRequestCount === 0) {

_.debounce(tryCloseLoading, 300)()

}

}

const tryCloseLoading = () => {

if (needLoadingRequestCount === 0) {

loading.close()

}

}

在之前的版本中,tryHideFullScreenLoading 方法会判断 needLoadingRequestCount === 0 立即关闭 loading。现在使用 lodash. debounce,延迟 300ms 再调用 tryCloseLoading 方法。

现在 300ms 间隔内的 loading 也就合并为一次啦……

axios 配置loading_用Axios Element 实现全局的请求 loading相关推荐

  1. Vue3(撩课学院)笔记09-axios简介,发起get请求的两种方式,发起带参的get及post请求,发起并发请求,并发请求结果将数组展开,axios全局配置,axios配置及封装,请求和响应拦截

    1.axios简介 axios是基于promise可以用于浏览器和node.js的网络请求库,在服务器端使用原生node.js,在浏览气短使用ajax(即XMLHttpRequests) 2.axio ...

  2. axios请求拦截器错误_Axios使用拦截器全局处理请求重试

    Axios拦截器 Axios提供了拦截器的接口,让我们能够全局处理请求和响应.Axios拦截器会在Promise的then和catch调用前拦截到. 请求拦截示例 axios.interceptors ...

  3. 【收藏干货】axios配置大全

    一.安装 1. 利用npm安装npm install axios --save 2. 利用bower安装bower install axios --save 3. 直接利用cdn引入<scrip ...

  4. vue3之axios配置(阿飞)

    1.使用npm i axios --save 2.全局使用 main.js中 import { createApp } from 'vue' import App from './App.vue' i ...

  5. vue axios全局封装请求 和 vue三种js跳转页面方式

    axios全局封装请求 第一步在src文件下新建api文件 文件下新建request.js文件 // 导入axios import axios from "axios"; // 进 ...

  6. 【Vue】axios 配置详解

    文章目录 一.axios 定义 二.axios 特性 三.安装和使用 四.请求写法 执行 `GET` 请求: 执行 `POST` 请求: 执行多个并发请求: 五.axios API 六.创建实例 七. ...

  7. Vue+axios配置踩坑记录

    避免误导,先上亲测可用的代码: /*** Axios封装*./src/axios/index.js **/ import axios from 'axios' import { Notice,Mess ...

  8. 从实例入手学习使用vue+axios配置代理进行跨域访问百度音乐API

    场景 如果要使用axios直接进行跨域访问是不可以的,这是就需要配置代理了,为什么要配置代理呢? 原因就是因为客户端请求服务端的数据是存在跨域问题的,而服务器和服务器之间可以相互请求数据,是没有跨域的 ...

  9. vue-cli-3.0 axios 配置

    2019独角兽企业重金招聘Python工程师标准>>> 参考:[https://www.jianshu.com/p/b22d03dfe006] 以下是可行的 npm install ...

最新文章

  1. 5.4 加权最小二乘法
  2. linux分区表与uboot,Linux和Uboot下eMMC boot分区读写
  3. Spark天堂之门解密
  4. Markdown 基础语法与常见问题总结
  5. 短网址批量生成 v2.0
  6. 软件构架、架构和框架的区别
  7. OAuth2 授权码模式为什么不直接返回access_token
  8. ROS教程之读取激光雷达(sick_tim561)数据
  9. 微信小程序的测试方案总结
  10. Linux源码安装pgadmin4,CentOS7中安装pgAdmin 4
  11. 软件开发未来五大技术趋势
  12. 易语言助手安装后 导致易语言一打开就卡死的解决
  13. Android自定义键盘之汉字键盘
  14. homeassistants应用1-家庭监控摄像头
  15. 【愚公系列】2022年02月 微信小程序-Component组件的扩展
  16. ros构建机器人运动学模型_ROS环境下的机器人仿真模型构建方法研究
  17. 手机软件整理-其他类和GPS类软件
  18. adb 常用命令,面试必问
  19. SX1308无法升压带载发烫解决办法
  20. DGIOT国内首家轻量级物联网开源平台——dgiot-dtu实现PLC数据采集上云实时查看

热门文章

  1. python面向对象-1方法、构造函数
  2. 对于个人(注册表)与团队(团队表)(两张表没有关联)的展示与可空判断
  3. CentOS 6.5 Zabbix-agent3.2 安装 1.0版
  4. * 类描写叙述:字符串工具类 类名称:String_U
  5. Zabbix监控(十六):分布式监控-Zabbix Proxy
  6. 集算器访问HTTP数据的代码示例
  7. Md5 Md5实现原理
  8. Session莫名丢失的原因及解决办法[转载]
  9. leetcode 1833. 雪糕的最大数量
  10. 深入理解InnoDB(4)—索引使用