v-loading指令
Posted 魔法少女郭德纲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了v-loading指令相关的知识,希望对你有一定的参考价值。
v-loading指令
v-loading 的主要思路
这里讲的是 区域加载
- 导入
loading
组件, 获得loading
组件的dom
, 插入到绑定v-loading
指令的parentNode
中。 - 获取
parentNode
的宽高定位等样式, 赋值给loading
组件样式, 来保证loading
组件在区域内全覆盖。 - 这里要注意的是:
loading
组件一定是要脱离文档流的,所以一定是有position: absolute
,所以,如果parentNode
没有定位属性,要给parentNode
加上position: relative
代码实现
/* main.js */
//...
import Loading from "./components/Loading/index.js"
Vue.use(Laoding)
//...
/* components/Loading/loading.vue */
<template>
<div style="position: absolute" v-show="visible">组件正在加载,请耐性等待<div>
</template>
<script>
export default {
data(){
return {
visible: true
}
}
}
</script>
/* components/Loading/index.js */
// 为了方便阅读,代码没有再做封装和优化
import loading from "./loading.vue"
export default {
install(Vue){
const Constructor = Vue.extend(loading)
const loadingComponent = new Constructor()
const loadingComponentDom = loadingComponent.$mount().$el
Vue.directive("loading", {
bind(el,binding){
//需要等到dom更新后,才能拿到parentNode即el的样式
Vue.nextTick(()=>{
const style = window.getComputedStyle(el,null)
loadingComponentDom.style.width = style.width
loadingComponentDom.style.height = style.height
if(style.position === "static") {
el.style.position = "relative"
}
el.appendChild(loadingComponentDom)
loadingComponent.visible = Boolean(binding.value)
el.instance = loadingComponent
})
},
update(el,binding){
el.instance.visible = Boolean(binding.value)
}
})
}
}
以上是关于v-loading指令的主要内容,如果未能解决你的问题,请参考以下文章
vue2自定义指令-加载指令v-loading和占位图指令v-showimg