vue axios拦截器 + 自编写插件 实现全局 loading 效果;
项目需求:用自定义的 .gif 图标实现全局 loading 效果;为避免在每个页面手动添加,且简单高效的实现,经查阅资料,最终采用了 vue axios拦截器 + 自编写 loading 插件;下面直接贴上代码~
在公用模块定义loading文件,含 index.js,loading.vue文件,文件结构如下:

注:loading.vue 与 index.js 之间的传值通过props实现,代码如下:
loading.vue
<template>
<div class="load-model" v-show="showLoading">
<img src="../images/loading.gif" alt="loading...">
</div>
</template>
<script>
export default {
data(){
return {
}
},
props:{
showLoading:false
}
}
</script>
<style scoped>
.load-model{
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
/*background:rgba(255,255,255,0.8);*/
/* background:rgba(0,0,0,0.6); */
}
.load-model > img{
width: 12rem;
height: 12rem;
margin-top: -5rem;
}
</style>
index.js
let loadTemp = require('./loading.vue').default; // cli3.0以后引入vue模板需要default
let Load = {}; // 定义插件对象
Load.install = (Vue,options) => { // Vue的install方法,用于定义vue插件
// 如果存在loading 不重复创建DOM
if(document.getElementsByClassName('.load-model').length) return;
let lTemp = Vue.extend(loadTemp);
// 实例化VUE实例
let $vm = new lTemp();
// 此处使用$mount来手动开启编译,用$el来访问元素,并插入到body中
let tpl = $vm.$mount().$el;
document.body.appendChild(tpl);
Vue.prototype.$loading = { // 在Vue的原型上添加实例方法,以全局调用
show(options){
if(options == "loading"){
$vm.showLoading = true;
}
},
hide(){
$vm.showLoading = false;
}
}
}
// 导出Load
export default Load;
插件写完后在main.js 中全局调用:
import Loading from './common/loading' Vue.use(Loading)
这样的话我们就可以在所需要调用的页面调用如下方法:
this.$loading.show("loading"); // 触发 loading 事件
this.$loading.hide(); // 关闭 loading 事件
这样的添加只适用于项目小然后页面比较少的情况下,在大项目下或页面较多的情况下,这样维护起来很繁琐且麻烦,由此我们借用 axios 拦截器,保证统一在一个地方触发与关闭,如下为 axios 拦截器的代码:
开启 loading 效果的代码为:Vue.prototype.$loading.show("loading");
关闭 loading 效果的代码为:Vue.prototype.$loading.hide();
axios_api.js
import Vue from 'vue';
import axios from 'axios';//更改http请求插件
import {Indicator, Toast} from 'mint-ui';
let toast = function (text) {
Toast({
message: text,
duration: 2000
})
};
// 设置全局的请求次数,请求的间隙
axios.defaults.retry = 1;
axios.defaults.retryDelay = 500;
axios.interceptors.request.use(config => {
Vue.prototype.$loading.show("loading");
config.timeout = 60000;
config.headers['Content-Type'] = 'application/json;charset=utf-8';
return config
}, error => {
return Promise.reject(error)
});
axios.interceptors.response.use(response => {
if (response.status == 200) {
setTimeout(() => {
Vue.prototype.$loading.hide();
},500);
} else {
setTimeout(() => {
Vue.prototype.$loading.hide();
},500);
toast('获取数据失败');
}
return response;
}, error => {
// var config = error.config;
// if (!config || !config.retry) return Promise.reject(error);
// config.__retryCount = config.__retryCount || 0;
// if (config.__retryCount >= config.retry) {
setTimeout(() => {
Vue.prototype.$loading.hide();
},500);
if (error.response) {
switch (error.response.status) {
case 0:
toast('网络连接超时');
break;
case 404:
toast('您请求的功能不存在');
break;
case 408:
toast('请求超时');
break;
default:
toast('请求失败');
break;
}
return Promise.reject(error.response.data);
} else {
if (!axios.isCancel(error)) {
toast('网络连接超时');
}
return Promise.reject(error);
}
// }
// config.__retryCount += 1;
// var backoff = new Promise(function (resolve) {
// setTimeout(function () {
// resolve();
// }, config.retryDelay || 1);
// });
// return backoff.then(function () {
// return axios(config);
// });
});
export default axios;
vue axios拦截器 + 自编写插件 实现全局 loading 效果;的更多相关文章
- vue --- axios拦截器+form格式请求体
在vue2.x中使用CLI生成的模板有很大改变,需要自己手动在main.ts同级目录下新建interceptors.ts interceptors.ts import axios from 'axio ...
- vue axios 拦截器
前言 项目中需要验证登录用户身份是否过期,是否有权限进行操作,所以需要根据后台返回不同的状态码进行判断. 第一次使用拦截器,文章中如有不对的地方还请各位大佬帮忙指正谢谢. 正文 axios的拦截器分为 ...
- vue axios拦截器的封装
// request.js import axios from 'axios' import qs from 'qs' // 创建axios实例 const service = axios.creat ...
- vue axios拦截器介绍
关于axios的拦截器是一个作用非常大,非常好用的东西.分为请求拦截器和响应拦截器两种.我一般把拦截器写在main.js里. 1. 请求拦截器 请求拦截器的作用是在请求发送前进行一些操作,例如在每个请 ...
- vue axios拦截器加全局loading
import axios from 'axios' import util from './util' import {showFullScreenLoading, tryHideFullScreen ...
- Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
准备 利用vue-cli脚手架创建项目 进入项目安装vuex.axios(npm install vuex,npm install axios) axios配置 项目中安装axios模块(npm in ...
- vue导航守卫和axios拦截器的区别
在Vue项目中,有两种用户登录状态判断并处理的情况,分别为:导航守卫和axios拦截器. 一.什么是导航守卫? vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航.(在路由跳转时 ...
- Vue2学习小记-给Vue2路由导航钩子和axios拦截器做个封装
1.写在前面 最近在学习Vue2,遇到有些页面请求数据需要用户登录权限.服务器响应不符预期的问题,但是总不能每个页面都做单独处理吧,于是想到axios提供了拦截器这个好东西,再于是就出现了本文. 2. ...
- 12. 前后端联调 + ( proxy代理 ) + ( axios拦截器 ) + ( css Modules模块化方案 ) + ( css-loader ) + ( 非路由组件如何使用history ) + ( bodyParser,cookieParser中间件 ) + ( utility MD5加密库 ) + ( nodemon自动重启node ) + +
(1) proxy 前端的端口在:localhost:3000后端的端口在:localhost:1234所以要在webpack中配置proxy选项 (proxy是代理的意思) 在package.jso ...
随机推荐
- Android 提高 gradle 的编译速度
随着项目在国内各个商店上线,开始介入了渠道的概念. 目前总共有 13 家商店,尝试使用 ./gradlew assembleRelease 命令打包,耗时将近 40 分钟. 因此搜索了一些可以提供编译 ...
- 【基础篇】elasticsearch之索引模板Template[转]
一,模板简述:template大致分成setting和mappings两部分:索引可使用预定义的模板进行创建,这个模板称作Index templates.模板设置包括settings和mappings ...
- 环境的配置; host 配置地址
1.环境的配置: C:\Windows\System32\drivers\etc 2.如果没有下载host 切记复制etc的文件,在c盘桌面打开,更改后替换 3.可下载host 和fiddle 4.多 ...
- Criteo电面二
是第二次Video电面.本来约的是个俄罗斯人,结果面试时才发现换了一位国人大哥.面试这么久,还是第一次遇到国人,然后就被放水了,真给力! 第二天通知约onsite,查了地图,公司就在斯坦福对面.希望能 ...
- phalcon bug: model的findFirst会自动忽略一些空格
version: Phalcon 3 如果DB存在一条记录phone='13012345678 '(后边有一个空格), 则在查询User::findFirst("phone = '13012 ...
- TCP连接的状态与关闭方式,及其对Server与Client的影响
1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用.特定数据包以及超时等,具体状态如下所示: CLOSED:初始状态, ...
- node-sass 安装失败 Failed at the node-sass@4.9.2 postinstall script的解决
控制台运行npm install时报错,报错信息如下: npm ERR! code ELIFECYCLEnpm ERR! errno 1npm ERR! node-sass@4.9.2 postins ...
- AES和RSA加解密的Python用法
AES AES 是一种对称加密算法,用key对一段text加密,则用同一个key对密文解密, from Crypto import Random from Crypto.Hash import SHA ...
- RTX临界段,中断锁与任务锁
临界段 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断,在进入临界段之前须关中断,而临界段代码执行完毕后,要立即开中断. ...
- C# windows GDI+仿画图 绘图程序设计
C# windows GDI+仿画图 绘图程序设计 1.介绍 这里分享一个简单的画图程序 原作者:author: ping3108@163.com 2.程序主窗体设计 3.程序设计 本程序工程使用VS ...