用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 相关文章推荐
Ext.FormPanel 提交和 Ext.Ajax.request 异步提交函数的区别
Nov 12 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
Jul 21 Javascript
jQuery前端框架easyui使用Dialog时bug处理
Dec 05 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
May 15 Javascript
学习JavaScript设计模式(单例模式)
Nov 26 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
Apr 17 Javascript
设置jQueryUI DatePicker默认语言为中文
Jun 04 Javascript
加快Vue项目的开发速度的方法
Dec 12 Javascript
Nuxt.js 数据双向绑定的实现
Feb 17 Javascript
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
详解Vue-Router源码分析路由实现原理
May 15 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
Dec 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/03 冲泡冲煮
smarty实现多级分类的方法
2014/12/05 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
详解yii2使用多个数据库的案例
2017/06/16 PHP
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
简单的代码实现jquery定时器
2014/01/03 Javascript
javascript获取系统当前时间的方法
2015/11/19 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
详解javascript跨浏览器事件处理程序
2016/03/27 Javascript
angular基于路由控制ui-router实现系统权限控制
2016/09/27 Javascript
详解jquery easyui之datagrid使用参考
2016/12/05 Javascript
javascript实现简单的ajax封装示例
2016/12/28 Javascript
Vue.js原理分析之observer模块详解
2017/02/17 Javascript
Vue.js 2.0 移动端拍照压缩图片上传预览功能
2017/03/06 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
JavaScript 用fetch 实现异步下载文件功能
2017/07/21 Javascript
Vue Element校验validate的实例
2020/09/21 Javascript
在vue中使用image-webpack-loader实例
2020/11/12 Javascript
原生JavaScript实现换肤
2021/02/19 Javascript
Python的__builtin__模块中的一些要点知识
2015/05/02 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
Python JSON格式数据的提取和保存的实现
2019/03/22 Python
Python3实现定时任务的四种方式
2019/06/03 Python
python实现简单银行管理系统
2019/10/25 Python
浅谈keras的深度模型训练过程及结果记录方式
2020/01/24 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
个人查摆剖析材料
2014/10/16 职场文书
计划生育工作汇报
2014/10/28 职场文书
会计入职心得体会
2016/01/22 职场文书
幼儿园2016圣诞节活动总结
2016/03/31 职场文书
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫
Spring Bean是如何初始化的详解
2022/03/22 Java/Android
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python