elementui组件_elementui 中 loading 组件源码解析(续)
上一篇我们说了elementui如何将loading组件添加到 Vue 实例上,具体内容见上期 elementui 中 loading 组件源码解析。
这一篇我们开始讲讲自定义指令
自定义指令
关于自定义指令,详细的前置信息还是官方文档最全,传送门
接下来就是 elementui 中的源码了,为了更方便阅读,我也是做了一定的简化
import loadingVue from './loading.vue';
const Mask = Vue.extend(loadingVue);
Vue.directive('loading', {// 只调用一次 指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置bind: function (el, binding, vnode) {const textExr = el.getAttribute('element-loading-text');const spinnerExr = el.getAttribute('element-loading-spinner');const backgroundExr = el.getAttribute('element-loading-background');const customClassExr = el.getAttribute('element-loading-custom-class');const vm = vnode.context;const mask = new Mask({el: document.createElement('div'),data: {text: vm && vm[textExr] || textExr,spinner: vm && vm[spinnerExr] || spinnerExr,background: vm && vm[backgroundExr] || backgroundExr,customClass: vm && vm[customClassExr] || customClassExr,fullscreen: !!binding.modifiers.fullscreen}});el.instance = mask;el.mask = mask.$el;el.maskStyle = {};binding.value && toggleLoading(el, binding);},update: function (el, binding) {el.instance.setText(el.getAttribute('element-loading-text'));if (binding.oldValue !== binding.value) {toggleLoading(el, binding);}},unbind: function (el, binding) {if (el.domInserted) {el.mask &&el.mask.parentNode &&el.mask.parentNode.removeChild(el.mask);toggleLoading(el, { value: false, modifiers: binding.modifiers });}el.instance && el.instance.$destroy();}
});
// 判断 loading 组件挂载的el
const toggleLoading = (el, binding) => {if (binding.value) {Vue.nextTick(() => {// 判断 fullscreen 如果有则绑在 body 上if (binding.modifiers.fullscreen) {insertDom(document.body, el, binding);} else {// 判断是否要绑定在 body 上if (binding.modifiers.body) {insertDom(document.body, el, binding);} else {insertDom(el, el, binding);}}});} else {afterLeave(el.instance, _ => {if (!el.instance.hiding) return;el.domVisible = false;el.instance.hiding = false;}, 300, true);el.instance.visible = false;el.instance.hiding = true;}
};
// 顾名思义 将DOM插入到文档中,并控制源码中 loading.vue 的显示和隐藏
const insertDom = (parent, el, binding) => {// 判断 domVisible 以及 el 中样式是否消失或隐藏if (!el.domVisible && el.style['display'] !== 'none' && el.style['visibility'] !== 'hidden') {Object.keys(el.maskStyle).forEach(property => {el.mask.style[property] = el.maskStyle[property];});el.domVisible = true;parent.appendChild(el.mask);Vue.nextTick(() => {if (el.instance.hiding) {el.instance.$emit('after-leave');} else {el.instance.visible = true;}});el.domInserted = true;} else if (el.domVisible && el.instance.hiding === true) {el.instance.visible = true;el.instance.hiding = false;}
};
添加自定义指令部分内容完成,更多详情见github
最后,源码中是将以上的代码包裹在 loadingDirective 这个对象中,然后在 loadingDirective 上面添加 install 方法,最终在外层 index 文件中通过vue.use调用,简化代码如下
const loadingDirective = {};
loadingDirective.install = Vue => {
// 上面的代码
}
下面是源码的简略图
自此,loading 组件的源码分析全部结束
elementui组件_elementui 中 loading 组件源码解析(续)相关推荐
- Unity中的UGUI源码解析之事件系统(2)-EventSystem组件
Unity中的UGUI源码解析之事件系统(2)-EventSystem组件 今天介绍我们的第一个主角: EventSystem. EventSystem在整个事件系统中处于中心, 相当于事件系统的管理 ...
- Unity中的UGUI源码解析之事件系统(8)-输入模块(中)
Unity中的UGUI源码解析之事件系统(8)-输入模块(中) 接上一篇文章, 继续介绍输入模块. Unity中主要处理的是指针事件, 也就是在2d平面上跟踪指针设备输入坐标的的事件, 这一类事件有鼠 ...
- Unity中的UGUI源码解析之事件系统(9)-输入模块(下)
Unity中的UGUI源码解析之事件系统(9)-输入模块(下) 接上一篇文章, 继续介绍输入模块. StandaloneInputModule类是上一篇文章介绍的抽象类PointerInputModu ...
- Unity中的UGUI源码解析之事件系统(6)-RayCaster(下)
Unity中的UGUI源码解析之事件系统(6)-RayCaster(下) 接上一篇文章, 继续介绍投射器. GraphicRaycaster GraphicRaycaster继承于BaseRaycas ...
- Unity中的UGUI源码解析之事件系统(3)-EventData
Unity中的UGUI源码解析之事件系统(3)-EventData 为了在事件系统中传递数据, Unity提供了EventData相关的类来封装这一类数据. 了解这些结构有助于我们对后面模块的学习. ...
- Unity中的UGUI源码解析之图形对象(Graphic)(2)-ICanvasElement
Unity中的UGUI源码解析之图形对象(Graphic)(2)-ICanvasElement 在上一篇文章中, 我们对整个Graphic部分做了概述, 这篇文章我们介绍ICanvasElement和 ...
- elementui table某一列是否显示_elementui 中 loading 组件源码解析(续)
上一篇我们说了elementui如何将loading组件添加到 Vue 实例上,具体内容见上期 elementui 中 loading 组件源码解析. 这一篇我们开始讲讲自定义指令 自定义指令 关于自 ...
- springsecurity sessionregistry session共享_要学就学透彻!Spring Security 中 CSRF 防御源码解析...
今日干货 刚刚发表查看:66666回复:666 公众号后台回复 ssm,免费获取松哥纯手敲的 SSM 框架学习干货. 上篇文章松哥和大家聊了什么是 CSRF 攻击,以及 CSRF 攻击要如何防御.主要 ...
- 要学就学透彻!Spring Security 中 CSRF 防御源码解析
上篇文章松哥和大家聊了什么是 CSRF 攻击,以及 CSRF 攻击要如何防御.主要和大家聊了 Spring Security 中处理该问题的几种办法. 今天松哥来和大家简单的看一下 Spring Se ...
最新文章
- 留念,第一次在C中调用lua成功!
- 自学python找到工作-学完python能找到工作么
- 5.16 12周第二课
- 同步方法 sleep和wait 线程同步的方法
- python自带的idle输入python_打开python自带IDLE出的问题
- python中函数的可变参数解析
- android 照片旋转并保存
- 音标与字母发音不同的字母总结
- php环境搭建及入门
- 基于卷积神经网络的人脸表情识别综述
- html小写罗马字符怎么写,如何在 LATEX 中插入大小写的罗马字符
- 英汉词典 JaVa_一个Java编写的英汉词典
- java生成vcf_Android vcard使用示例,生成vcf文件
- snapchat忘记账户_如何删除您的Snapchat帐户
- 战火与秩序迁城显示服务器忙,战火与秩序迁城方法介绍
- java 庖丁解牛中文分词_庖丁解牛中文分词包
- 【Maxent】最大熵的数学原理及其在推断问题中的应用
- FME2019试用过程
- 【微信小程序】学习笔记-----navigation-bar导航栏
- HT合泰 单片机的仿真调试
热门文章
- Warning: lio_listio returned EAGAIN Performance degradation may be seen
- C++ 删除字符串的首尾空字符
- JavaMail操作的总结(1)
- ListView列排序功能实现
- java字符类型的返回值,Java字符类isWhitespace()方法及示例
- python 实例化方法_Python中__new__()方法的使用和实例化
- C语言经典回溯算法之解决数的组合问题(详解)
- Python之数据分析(Numpy的矩阵相关操作、ufunc泛化函数对象)
- Python自定义词云图形状和文本颜色
- Python内置函数int()高级用法