新建一个loading文件夹(新建index.js、loading.js、loading.vue)
index.js
import loading from './loading'
export default {
install (Vue) {
Vue.directive('loading', loading)
}
}
loading.js
// plugins/loading/loading.js
import Vue from 'vue'
import Loading from './loading.vue'
const Mask = Vue.extend(Loading)
const toggleLoading = (el, binding) => {
if (binding.value) {
Vue.nextTick(() => {
// 控制loading组件显示
el.instance.visible = true
// 插入到目标元素
insertDom(el, el, binding)
})
} else {
el.instance.visible = false
}
}
const insertDom = (parent, el) => {
parent.appendChild(el.mask)
}
export default {
bind: function (el, binding, vnode) {
const mask = new Mask({
el: document.createElement('div'),
data () {}
})
el.instance = mask
el.mask = mask.$el
el.maskStyle = {}
binding.value && toggleLoading(el, binding)
},
update: function (el, binding) {
if (binding.oldValue !== binding.value) {
toggleLoading(el, binding)
}
},
unbind: function (el, binding) {
el.instance && el.instance.$destroy()
}
}
loading.vue
<template>
<div class="loadEffect" v-show="visible">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
</template>
<script>
export default {
data() {
return {
visible: false
}
}
}
</script>
<style lang="less" scoped>
.loadEffect {
width: 100px;
height: 100px;
position: fixed;
margin: 0 auto;
margin-top: 200px;
top: 0px;
left: 0;
right: 0;
z-index: 100;
}
.loadEffect span {
display: inline-block;
width: 16px;
height: 16px;
border-radius: 50%;
background: #01BB7D;
position: absolute;
animation: load 1.04s ease infinite;
}
@keyframes load {
0% {
opacity: 1;
}
100% {
opacity: 0.2;
}
}
.loadEffect span:nth-child(1) {
left: 0;
top: 50%;
margin-top: -8px;
animation-delay: 0.13s;
}
.loadEffect span:nth-child(2) {
left: 14px;
top: 14px;
animation-delay: 0.26s;
}
.loadEffect span:nth-child(3) {
left: 50%;
top: 0;
margin-left: -8px;
animation-delay: 0.39s;
}
.loadEffect span:nth-child(4) {
top: 14px;
right: 14px;
animation-delay: 0.52s;
}
.loadEffect span:nth-child(5) {
right: 0;
top: 50%;
margin-top: -8px;
animation-delay: 0.65s;
}
.loadEffect span:nth-child(6) {
right: 14px;
bottom: 14px;
animation-delay: 0.78s;
}
.loadEffect span:nth-child(7) {
bottom: 0;
left: 50%;
margin-left: -8px;
animation-delay: 0.91s;
}
.loadEffect span:nth-child(8) {
bottom: 14px;
left: 14px;
animation-delay: 1.04s;
}
</style>
在main.js引入
// 导入自定义loading
import Loading from './common/vux/loading';
Vue.use(Loading)
使用v-loading指令
<div v-loading="isLoad"></div>
data() {
return {
isLoad:true,
}
}
隐藏loading为this.isLoad= false;