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 相关文章推荐
jQuery 性能优化指南(3)
May 21 Javascript
javascript类继承机制的原理分析
Sep 12 Javascript
jQuery实现的立体文字渐变效果
May 17 Javascript
基于javascript 闭包基础分享
Jul 10 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
Nov 05 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
Dec 10 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
Aug 08 Javascript
JS正则表达式之非捕获分组用法实例分析
Dec 28 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
Jun 09 Javascript
详解vue-cli构建项目反向代理配置
Sep 07 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
Nov 30 Javascript
vue mvvm数据响应实现
Nov 11 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
也谈截取首页新闻 - 范例
2006/10/09 PHP
php正则校验用户名介绍
2008/07/19 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
laravel 5.5 关闭token的3种实现方式
2019/10/24 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
一个选择最快的服务器转向代码
2009/04/27 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
2016/01/08 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
VUE2.0中Jsonp的使用方法
2018/05/22 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
js+css实现扇形导航效果
2020/08/18 Javascript
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
Python多进程机制实例详解
2015/07/02 Python
tensorflow识别自己手写数字
2018/03/14 Python
Python实现识别图片内容的方法分析
2018/07/11 Python
python实现QQ批量登录功能
2019/06/19 Python
python交易记录链的实现过程详解
2019/07/03 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
Django实现基于类的分页功能
2019/10/31 Python
Python plt 利用subplot 实现在一张画布同时画多张图
2021/02/26 Python
css实例教程 一款纯css3实现的超炫动画背画特效
2014/11/05 HTML / CSS
CSS3的RGBA中关于整数和百分比值的转换
2015/08/04 HTML / CSS
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
哈曼俄罗斯官方网上商店:Harman.club
2020/07/24 全球购物
房地产营销策划方案
2014/02/08 职场文书
《鞋匠的儿子》教学反思
2014/03/02 职场文书
小学见习报告
2015/06/23 职场文书
vue使用watch监听属性变化
2022/04/30 Vue.js