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获取元素文档大小、偏移和位置和滚动条位置的方法集合
Jan 12 Javascript
用Javascript实现Windows任务管理器的代码
Mar 27 Javascript
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
Jun 21 Javascript
js冒泡法和数组转换成字符串示例代码
Aug 14 Javascript
关于jQuery中的each方法(jQuery到底干了什么)
Mar 05 Javascript
一个不错的仿携程自定义数据下拉选择select
Sep 01 Javascript
移动端横屏的JS代码(beta)
May 16 Javascript
angular $watch 一个变量的变化(实例讲解)
Aug 02 Javascript
微信小程序自定义底部导航带跳转功能
Nov 27 Javascript
基于jQuery实现可编辑的表格
Dec 11 jQuery
jquery实现垂直手风琴导航栏
Feb 18 jQuery
JavaScript实现移动端弹窗后禁止滚动
May 25 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获取一个字符串中间一部分字符的方法
2014/08/19 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
2019/05/09 PHP
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
简介JavaScript中的italics()方法的使用
2015/06/08 Javascript
JavaScript中的Math.LN2属性用法详解
2015/06/12 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
JQuery悬停控制图片轮播——代码简单
2015/08/05 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
JavaScript 数组中最大最小值
2016/06/05 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
js中apply与call简单用法详解
2017/11/06 Javascript
详解微信小程序的 request 封装示例
2018/08/21 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
详解Python3 基本数据类型
2019/04/19 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
2019/05/21 Python
python高斯分布概率密度函数的使用详解
2019/07/10 Python
DJANGO-URL反向解析REVERSE实例讲解
2019/10/25 Python
使用PyCharm进行远程开发和调试的实现
2019/11/04 Python
使用python的turtle绘画滑稽脸实例
2019/11/21 Python
python简单的三元一次方程求解实例
2020/04/02 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
2020/05/26 Python
利用css3径向渐变做一张优惠券的示例
2018/03/22 HTML / CSS
什么是组件架构
2016/05/15 面试题
房地产开发项目建议书
2014/05/16 职场文书
统计员岗位职责
2015/02/11 职场文书
初中同学会致辞
2015/08/01 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书
导游词之山东孔庙
2019/11/04 职场文书
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android