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实现全部删或清空所选的操作
May 27 Javascript
解析javascript中鼠标滚轮事件
May 26 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
Dec 18 Javascript
JavaScript中关于iframe滚动条的去除和保留
Nov 17 Javascript
实现JavaScript高性能的数据存储
Dec 11 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
Mar 09 Javascript
vue基于Vue2.0和高德地图的地图组件实例
Apr 28 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
May 02 Javascript
Vue Cli与BootStrap结合实现表格分页功能
Aug 18 Javascript
vue父子组件的嵌套的示例代码
Sep 08 Javascript
基于js 字符串indexof与search方法的区别(详解)
Dec 04 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
Feb 04 jQuery
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
espresso double下 咖啡粉超细时 饼压力对咖啡的影响
2021/03/03 冲泡冲煮
php foreach循环中使用引用的问题
2013/11/06 PHP
详解PHP中的状态模式编程
2015/08/11 PHP
ThinkPHP中html:list标签用法分析
2016/01/09 PHP
Ajax+PHP实现的分类列表框功能示例
2019/02/11 PHP
jQuery 锚点跳转滚动条平滑滚动一句话代码
2010/04/30 Javascript
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
2011/10/24 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
JS模拟Dialog弹出浮动框效果代码
2015/10/16 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
2016/01/21 Javascript
jQuery中fadein与fadeout方法用法示例
2016/09/16 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
Angular JS 生成动态二维码的方法
2017/02/23 Javascript
js循环map 获取所有的key和value的实现代码(json)
2018/05/09 Javascript
深入Node TCP模块的理解
2019/03/13 Javascript
JavaScript的变量声明与声明提前用法实例分析
2019/11/26 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
2019/11/26 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
python实现监控linux性能及进程消耗性能的方法
2014/07/25 Python
详解【python】str与json类型转换
2019/04/29 Python
Python 70行代码实现简单算式计算器解析
2019/08/30 Python
python中实现栈的三种方法
2020/12/19 Python
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
内部类的定义、种类以及优点
2013/10/16 面试题
J2EE模式面试题
2016/10/11 面试题
实习教师个人的自我评价
2013/11/08 职场文书
社区活动邀请函范文
2014/01/29 职场文书
2014年两会学习心得范例
2014/03/17 职场文书
部队2014年终工作总结
2014/11/27 职场文书
2015年教师节广播稿
2015/08/19 职场文书
2016天猫双十一广告语
2016/01/28 职场文书