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的构造函数和constructor属性
Jan 09 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
Apr 25 Javascript
js调用AJAX时Get和post的乱码解决方法
Jun 04 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
Jun 15 Javascript
js防止页面被iframe调用的方法
Oct 30 Javascript
jQuery中nextAll()方法用法实例
Jan 07 Javascript
JS操作xml对象转换为Json对象示例
Mar 25 Javascript
详解RequireJS按需加载样式文件
Apr 12 Javascript
微信小程序之购物车功能
Sep 23 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
Aug 16 Javascript
React精髓!一篇全概括小结(急速)
May 23 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
Jun 05 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 foreach循环中使用引用的问题
2013/11/06 PHP
php动态变量定义及使用
2015/06/10 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
javascript实现的网页局布刷新效果
2008/12/01 Javascript
js 代码优化点滴记录
2012/02/19 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
用jQuery toggleClass 实现鼠标移上变色
2014/05/14 Javascript
jQuery下拉友情链接美化效果代码分享
2015/08/26 Javascript
javascript数组克隆简单实现方法
2015/12/16 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
JavaScript禁止复制与粘贴的实现代码
2016/05/16 Javascript
Vuejs第十篇之vuejs父子组件通信
2016/09/06 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
微信小程序 数据缓存实现方法详解
2019/08/26 Javascript
使用 UniApp 实现小程序的微信登录功能
2020/06/09 Javascript
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
[01:30:54]《加油DOTA》 第三期
2014/08/18 DOTA
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
基于wxpython实现的windows GUI程序实例
2015/05/30 Python
机器学习10大经典算法详解
2017/12/07 Python
python的scikit-learn将特征转成one-hot特征的方法
2018/07/10 Python
python中单例常用的几种实现方法总结
2018/10/13 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
Python xlrd模块导入过程及常用操作
2020/06/10 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
利用Storage Event实现页面间通信的示例代码
2018/07/26 HTML / CSS
接口的多继承会带来哪些问题
2015/08/17 面试题
高级技校毕业生自荐信
2013/11/18 职场文书
一帮一活动总结
2014/05/08 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书
乱世佳人观后感
2015/06/08 职场文书
婚庆答谢词大全
2015/09/29 职场文书
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫