vuex+axios+element-ui实现页面请求loading操作示例


Posted in Javascript onFebruary 02, 2020

本文实例讲述了vuex+axios+element-ui实现页面请求loading操作。分享给大家供大家参考,具体如下:

前言

我们在平常写项目的时候,发请求的时候肯定会习惯用一个 loading 遮罩层来防止用户在没拿到数据之前误操作

如果是页面同时只发送一个请求,那么无论是在组件中或者是在 axios 插件中进行请求和响应拦截都可以做到

但是,当一个页面同时要发送多个请求的时候,这么做显然就不行了

因为最先完成的请求会把所有请求的 loading 都给关闭

举个例子,第一个请求的响应时间为 3s ,第二个请求的响应时间为 1s ,两个同时请求的时候,loading 会开始

但是当 1s 后第二个请求完成后,会直接关闭 loading,但是此时第一个请求还没完成,所有这样肯定是不行的

今天就用这篇文章来介绍下我在项目中是怎么应对这种情况的

一、用到的东西

  1. element-ui 的 loading
  2. vuex 的状态管理
  3. axios 的请求拦截和响应拦截

二、实现

其实这个思路很简单,就是通过 vuex 来管理请求的个数,假如用 apiCount 这个变量来代表请求的个数,每次请求的时候打开 loading 并且 apiCount  加一,每次响应完成或者失败的时候都让 apiCount 减一,并且检测 apiCount 变量的值,当为 apiCount=0 的时候,就关闭 loading 就可以了,代码如下:

store.js 代码(用来管理 vuex)

import Vue from "vue";
import Vuex from "vuex";
import { Loading } from "element-ui";
Vue.use(Vuex);
const state = {
 //请求计数
 apiCount: 0,
 //loading实例
 loadingInstance: null,
};
const mutations = {
 /* 打开Loading */
 startLoading(state, msg) {
  state.loadingInstance = Loading.service({
   lock: true,
   text: msg ? msg : "加载中...",
   background: "rgba(0, 0, 0, 0.7)"
  });
 },
 /* 关闭loading */
 closeLoading(state) {
  state.loadingInstance.close();
 },
 /* 更新请求线程池 */
 updateApiCount(state, handle) {
  if (handle == "add") {
   state.apiCount++;
   this.commit("startLoading");
  } else {
   state.apiCount--;
   if (state.apiCount <= 0) {
    this.commit("closeLoading");
   }
  }
 }
};
const store = new Vuex.Store({
 state,
 mutations
});
export default store;

request.js 代码(封装 axios 的文件)

import axios from "axios";
import { Message } from "element-ui";
import store from "../store/index";
import router from "../router/index";
const service = axios.create({
 baseURL: process.env.VUE_APP_BASE_URL,
 timeout: 0
});
service.interceptors.request.use(
 config => {
  store.commit("updateApiCount", "add");
  return config;
 },
 error => {
  store.commit("updateApiCount", "sub");
  Promise.reject(error);
 }
);
service.interceptors.response.use(
 response => {
  store.commit("updateApiCount", "sub");
  return response.data;
 },
 error => {
  store.commit("updateApiCount", "sub");
  return Promise.reject(error);
 }
);
export default service;

好了,这样就做到了请求的时候自动打开 loading,所有的请求结束才会关闭 loading 了,无论同时多少个请求都可以

希望本文所述对大家vue.js程序设计有所帮助。

Javascript 相关文章推荐
JS操作数据库的实例代码
Oct 17 Javascript
js对象基础实例分析
Jan 13 Javascript
JQuery异步获取返回值中文乱码的解决方法
Jan 29 Javascript
node.js require() 源码解读
Dec 13 Javascript
以JavaScript来实现WordPress中的二级导航菜单的方法
Dec 14 Javascript
JavaScript 用fetch 实现异步下载文件功能
Jul 21 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
Apr 22 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
May 07 Javascript
Javascript数组方法reduce的妙用之处分享
Jun 10 Javascript
CKeditor富文本编辑器使用技巧之添加自定义插件的方法
Jun 14 Javascript
微信小程序自定义tabBar在uni-app的适配详解
Sep 30 Javascript
原生JS实现拖拽功能
Dec 16 Javascript
vue实现的封装全局filter并统一管理操作示例
Feb 02 #Javascript
node 版本切换的实现
Feb 02 #Javascript
vue路由缓存的几种实现方式小结
Feb 02 #Javascript
vue简单封装axios插件和接口的统一管理操作示例
Feb 02 #Javascript
vue实现路由不变的情况下,刷新页面操作示例
Feb 02 #Javascript
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
Feb 01 #jQuery
基于node+vue实现简单的WebSocket聊天功能
Feb 01 #Javascript
You might like
最简单的PHP程序--记数器
2006/10/09 PHP
同时提取多条新闻中的文本一例
2006/10/09 PHP
php ImageMagick windows下安装教程
2015/01/26 PHP
详解PHP数组赋值方法
2015/11/07 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
Laravel实现批量更新多条数据
2020/04/06 PHP
一个多次搜索+多次传值的解决方案
2007/01/20 Javascript
Javascript Global对象
2009/08/13 Javascript
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
JavaScript编程中容易出BUG的几点小知识
2015/01/31 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
Javascript从数组中随机取出不同元素的两种方法
2016/09/22 Javascript
jquery平滑滚动到顶部插件使用详解
2017/05/08 jQuery
微信小程序之获取当前位置经纬度以及地图显示详解
2017/05/09 Javascript
JS监控关闭浏览器操作的实例详解
2017/09/12 Javascript
详解vue静态资源打包中的坑与解决方案
2018/02/05 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
JS中==、===你分清楚了吗
2020/03/04 Javascript
Vue Render函数创建DOM节点代码实例
2020/07/08 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
2016/06/29 Python
python3.0 模拟用户登录,三次错误锁定的实例
2017/11/02 Python
Python实现字符串匹配的KMP算法
2019/04/04 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
怎样自定义一个异常类
2016/09/27 面试题
介绍一下UNIX启动过程
2013/11/14 面试题
俄罗斯商务邀请函
2014/01/26 职场文书
广告创意求职信
2014/03/17 职场文书
如何用JS实现简单的数据监听
2021/05/06 Javascript