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 相关文章推荐
JS日历 推荐
Dec 03 Javascript
对采用动态原型方式无法展示继承机制得思考
Dec 04 Javascript
date.parse在IE和FF中的区别
Jul 29 Javascript
20个实用的JavaScript技巧分享
Nov 28 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
Aug 05 Javascript
基于jQuery实现表格的查看修改删除
Aug 01 Javascript
Jq通过td获取同行其它列td的方法
Oct 05 Javascript
js按条件生成随机json:randomjson实现方法
Apr 07 Javascript
微信小程序switch开关选择器使用详解
Jan 31 Javascript
angularjs获取到My97DatePicker选中的值方法
Oct 02 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
Apr 10 Javascript
vue 解决数组赋值无法渲染在页面的问题
Oct 28 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 解压rar文件及zip文件的方法
2014/05/05 PHP
PHP中异常处理的一些方法整理
2015/07/03 PHP
PHP获取用户客户端真实IP的解决方案
2016/10/10 PHP
浅谈PHP中的面向对象OOP中的魔术方法
2017/06/12 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
28个JS验证函数收集
2010/03/02 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
2011/07/11 Javascript
jquery click([data],fn)使用方法实例介绍
2013/07/08 Javascript
javascript 处理null及null值示例
2014/06/09 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
2016/10/20 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
Vue.js组件通信的几种姿势
2017/10/23 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
Python模块学习 datetime介绍
2012/08/27 Python
python将文本转换成图片输出的方法
2015/04/28 Python
Python脚本暴力破解栅栏密码
2015/10/19 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
python中defaultdict的用法详解
2017/06/07 Python
Sublime开发python程序的示例代码
2018/01/24 Python
python基础教程项目五之虚拟茶话会
2018/04/02 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
python爬取基于m3u8协议的ts文件并合并
2019/04/26 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
Python 使用matplotlib模块模拟掷骰子
2019/08/08 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
加拿大领先的冒险和户外零售商:Atmosphere
2017/12/19 全球购物
秘书专业自荐信范文
2013/12/26 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
《搭石》教学反思
2014/04/07 职场文书
文艺委员竞选稿
2015/11/19 职场文书
初二物理教学反思
2016/02/19 职场文书
英镑符号 £
2022/02/17 杂记
Java完整实现记事本代码
2022/06/16 Java/Android