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 DOM 元素ID就是全局变量
Sep 20 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
Jan 27 Javascript
js 调用百度地图api并在地图上进行打点添加标注
May 13 Javascript
jQuery中;function($,undefined) 前面的分号的用处
Dec 17 Javascript
js拖拽的原型声明和用法总结
Apr 04 Javascript
js中string和number类型互转换技巧(分享)
Nov 28 Javascript
轻松学习Javascript闭包
Mar 01 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
Mar 30 Javascript
jQuery输入框密码的显示隐藏【代码分享】
Apr 29 jQuery
JS 组件系列之BootstrapTable的treegrid功能
Jun 16 Javascript
微信小程序顶部可滚动导航效果
Oct 31 Javascript
javascript Number 与 Math对象的介绍
Nov 17 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处理换行符的问题 \r\n
2013/06/13 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
PHP中source #N问题的解决方法
2014/01/27 PHP
php中explode函数用法分析
2014/11/15 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
PHP的时间戳与具体时间转化的简单实现
2016/06/13 PHP
动态改变textbox的宽高的js
2006/10/26 Javascript
十个优秀的Ajax/Javascript实例网站收集
2010/03/31 Javascript
jquery中对表单的基本操作代码
2010/07/29 Javascript
JavaScript回调(callback)函数概念自我理解及示例
2013/07/04 Javascript
js如何取消事件冒泡
2013/09/23 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
用js实现博客打赏功能
2016/10/24 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
2016/12/21 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
Vue中v-for的数据分组实例
2018/03/07 Javascript
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
python实现简单的计时器功能函数
2015/03/14 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
应届生骨科医生求职信
2013/10/31 职场文书
校园文明标语
2014/06/13 职场文书
护士工作失误检讨书
2014/09/14 职场文书
庆元旦主持词
2015/07/06 职场文书
忆童年!用Python实现愤怒的小鸟游戏
2021/06/07 Python
spring 项目实现限流方法示例
2022/07/15 Java/Android