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 相关文章推荐
Javascript this 的一些学习总结
Aug 02 Javascript
用jquery模仿的a的title属性(兼容ie6/7)
Jan 21 Javascript
html+css+js实现xp window界面及有关功能
Mar 26 Javascript
js如何获取file控件的完整路径具体实现代码
May 15 Javascript
jQuery网页右侧广告跟随滚动代码分享
Apr 20 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
Jan 04 Javascript
微信小程序开发之入门实例教程篇
Mar 07 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
Jan 08 Javascript
ajax前台后台跨域请求处理方式
Feb 08 Javascript
利用npm 安装删除模块的方法
May 15 Javascript
小程序兼容安卓和IOS数据处理问题及坑
Sep 18 Javascript
如何管理Vue中的缓存页面
Feb 06 Vue.js
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编程语言开发动态WAP页面
2006/10/09 PHP
PHP中余数、取余的妙用
2015/06/29 PHP
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
2017/08/11 PHP
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
常用jQuery选择器总结
2014/07/11 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
Ajax和Comet技术总结
2017/02/19 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
详解easyui基于 layui.laydate日期扩展组件
2018/07/18 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
Vue实现日历小插件
2019/06/26 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
深入理解NumPy简明教程---数组2
2016/12/17 Python
Python实现字典的遍历与排序功能示例
2017/12/23 Python
基于python实现在excel中读取与生成随机数写入excel中
2018/01/04 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
python实现贪吃蛇双人大战
2020/04/18 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
Pycharm自带Git实现版本管理的方法步骤
2020/09/18 Python
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
2020/11/16 HTML / CSS
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
乡镇消防工作实施方案
2014/03/27 职场文书
安全环保标语
2014/06/09 职场文书
关于环保的活动方案
2014/08/25 职场文书
爱的教育读书笔记
2015/06/26 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python