用Axios Element实现全局的请求loading的方法


Posted in Javascript onMarch 15, 2018

背景

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

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

效果如下:

用Axios Element实现全局的请求loading的方法

分析

首先,请求开始的时候开始 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 一样。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
解析javascript 数组以及json元素的添加删除
Jun 26 Javascript
javascript面向对象特性代码实例
Jun 12 Javascript
js点击返回跳转到指定页面实现过程
Aug 20 Javascript
Bootstrap面板使用方法
Jan 16 Javascript
jQuery实现移动端Tab选项卡效果
Mar 15 Javascript
Vue.js自定义事件的表单输入组件方法
Mar 08 Javascript
angular2 ng2-file-upload上传示例代码
Aug 23 Javascript
js中数组对象去重的两种方法
Jan 18 Javascript
vue项目移动端实现ip输入框问题
Mar 19 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
Sep 05 Javascript
vue项目实现分页效果
Mar 24 Vue.js
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 Vue.js
基于IView中on-change属性的使用详解
Mar 15 #Javascript
解决iView中时间控件选择的时间总是少一天的问题
Mar 15 #Javascript
iview日期控件,双向绑定日期格式的方法
Mar 15 #Javascript
vue iview组件表格 render函数的使用方法详解
Mar 15 #Javascript
微信小程序实现换肤功能
Mar 14 #Javascript
Angular4集成ng2-file-upload的上传组件
Mar 14 #Javascript
iview table高度动态设置方法
Mar 14 #Javascript
You might like
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
php文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
PHP使用PDO操作sqlite数据库应用案例
2019/03/07 PHP
学习并汇集javascript匿名函数
2010/11/25 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
JS简单计算器实例
2015/01/20 Javascript
jQuery关键词说明插件cluetip使用指南
2015/04/21 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
BootStrap Table 获取同行不同列元素的方法
2016/12/19 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
vue中设置、获取、删除cookie的方法
2018/09/21 Javascript
js实现百度登录窗口拖拽效果
2020/03/19 Javascript
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
Python变量作用范围实例分析
2015/07/07 Python
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
tensorflow之变量初始化(tf.Variable)使用详解
2020/02/06 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
2020/04/27 Python
解决keras模型保存h5文件提示无此目录问题
2020/07/01 Python
Python3获取cookie常用三种方案
2020/10/05 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
HTML5播放实现rtmp流直播
2020/06/16 HTML / CSS
2014年社区庆元旦活动方案
2014/03/08 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
2014年新教师工作总结
2014/11/08 职场文书
售票员岗位职责
2015/02/15 职场文书
学校隐患排查制度
2015/08/05 职场文书
只用20行Python代码实现屏幕录制功能
2021/06/02 Python
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python