用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 相关文章推荐
自己开发Dojo的建议框架
Sep 24 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
Sep 15 Javascript
html向js方法传递参数具体实现
Aug 08 Javascript
js跳转页面方法实现汇总
Feb 11 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
Apr 11 Javascript
javascript实现确定和取消提示框效果
Jul 10 Javascript
javascript 数组去重复(在线去重工具)
Dec 17 Javascript
bootstrap网格系统使用方法解析
Jan 13 Javascript
Node.js websocket使用socket.io库实现实时聊天室
Feb 20 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
Mar 27 Javascript
vue.extend实现alert模态框弹窗组件
Apr 28 Javascript
Vue实现数据请求拦截
Oct 23 Javascript
基于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
咖啡因含量是由谁决定的?低因咖啡怎么来?低因咖啡适合什么人喝
2021/03/06 新手入门
PHP下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
php 动态执行带有参数的类方法
2009/04/10 PHP
javascript 小型动画组件与实现代码
2010/06/02 PHP
通过php快速统计某个数据库中每张表的数据量
2012/09/04 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
又一个小巧的图片预加载类
2007/05/05 Javascript
这段js代码得节约你多少时间
2011/12/20 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
2016/07/01 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
前端跨域的几种解决方式总结(推荐)
2017/08/16 Javascript
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
微信小程序实现选项卡效果
2018/11/06 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
[36:14]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第二局
2016/02/28 DOTA
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
python 多进程通信模块的简单实现
2014/02/20 Python
Python生成验证码实例
2014/08/21 Python
python实现将元祖转换成数组的方法
2015/05/04 Python
Python中序列的修改、散列与切片详解
2017/08/27 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
Pycharm+Python工程,引用子模块的实现
2020/03/09 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
聊聊python中的循环遍历
2020/09/07 Python
怀俄明州飞钓:Platte River Fly Shop
2017/12/28 全球购物
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
知识竞赛活动方案
2014/02/18 职场文书
人力资源经理的岗位职责范本
2014/02/28 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
JS轻量级函数式编程实现XDM三
2022/06/16 Javascript