在前端开发中很多中央都须要loading,上面咱们就看下如何在vue中实现一个全局的loading框,并且将其封装到axios中,实现发送申请时主动显示loading框,申请完结主动敞开loading框。

首先建一个 loading.vue 的页面

<template>

<div class="loadEffect _loadEffect">    <span></span>    <span></span>    <span></span>    <span></span>    <span></span>    <span></span>    <span></span>    <span></span></div>

</template>

<script>

export default {    data() {        return {};    }};

</script>

<style lang="scss" scoped>

.loadEffect {    width: 100px;    height: 100px;    position: relative;    margin: 0 auto;    top: -60%;    z-index: 9999;    span {        display: inline-block;        width: 20px;        height: 20px;        border-radius: 50%;        background: #Fa3;        position: absolute;        animation: load 1.04s ease infinite;        &:nth-child(1) {             left: 0;             top: 50%;             margin-top: -10px;             animation-delay: 0.13s;         }        &:nth-child(2) {             left: 14px;             top: 14px;             animation-delay: 0.26s;         }        &:nth-child(3) {             left: 50%;             top: 0;             margin-left: -10px;             animation-delay: 0.39s;         }        &:nth-child(4) {             top: 14px;             right: 14px;             animation-delay: 0.52s;         }        &:nth-child(5){             right: 0;             top: 50%;             margin-top: -10px;             animation-delay: 0.65s;         }        &:nth-child(6) {             right: 14px;             bottom:14px;             animation-delay: 0.78s;         }        &:nth-child(7) {             bottom: 0;             left: 50%;             margin-left: -10px;             animation-delay: 0.91s;         }        &:nth-child(8) {             bottom: 14px;             left: 14px;             animation-delay: 1.04s;         }    }    @keyframes load{        0% {            transform: scale(1.2);            opacity: 1;        }        100% {            transform: scale(.3);            opacity: 0.5;        }    }}

</style>
为了不便调用,咱们须要把loading组件封装成可函数式调用的API。

Vue.extend()能够生成一个 Vue 的子类构造函数,因为loading组件自身是一个vue实例,将其作为参数生成一个子类构造函数,只有动静操作loading的挂载元素el,便能够实现loading组件的函数式调用。创立loading.js,实现如下:

import Vue from 'vue';
import loading from './loading.vue';

// 扩大实例结构器
const LoadingConstructor = Vue.extend(loading);

// 创立一个vue实例,挂载元素为新创建的div
let initLoadingInstance = function () {

return new LoadingConstructor({    el: document.createElement('div'),});

}

// 删除dom节点
let removeDom = (node) => { if (node.parentNode) {

node.parentNode.removeChild(node);

}
};

let instance = initLoadingInstance();

// 敞开loading
let closeLoading = () => {

removeDom(instance.$el)

};

// 展现loading
let showLoading = function () {

document.body.appendChild(instance.$el);

}

export default {

showLoading,closeLoading

}
这样只有通过调用函数showLoading()和closeLoading()就能够展现和敞开loading框了。实现了loading框的函数式调用,那么如何实现在申请发送开始时主动调用loading框,在申请完结主动敞开loading框呢,这就波及到申请和响应的拦挡。

axios拦挡申请和响应

咱们应用axios作为ajax申请的解决框架,axios反对申请的拦挡和响应,具体能够参见 axios文档而后在main.js中引入axios,在其申请拦截器中展现loading框,在响应拦截器中敞开loading框。代码如下:

//引入 js

import loading from './components/common/loading.js'

// 拦挡申请
axios.interceptors.request.use(function (config) {

// 在发送申请之前展现loadingloading.showLoading()console.log('申请拦挡')return config;

}, function (error) {

// 对申请谬误做些解决console.log('申请错误处理')return Promise.reject(error);

});

// 拦挡响应
axios.interceptors.response.use(function (response) {

// 响应后敞开loadingloading.closeLoading()console.log('响应拦挡')return response;

}, function (error) {

// 对响应谬误也要敞开loadingloading.closeLoading()console.log('响应谬误')return Promise.reject(error);

});