上一篇我们说了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 组件源码解析(续)相关推荐

  1. Unity中的UGUI源码解析之事件系统(2)-EventSystem组件

    Unity中的UGUI源码解析之事件系统(2)-EventSystem组件 今天介绍我们的第一个主角: EventSystem. EventSystem在整个事件系统中处于中心, 相当于事件系统的管理 ...

  2. Unity中的UGUI源码解析之事件系统(8)-输入模块(中)

    Unity中的UGUI源码解析之事件系统(8)-输入模块(中) 接上一篇文章, 继续介绍输入模块. Unity中主要处理的是指针事件, 也就是在2d平面上跟踪指针设备输入坐标的的事件, 这一类事件有鼠 ...

  3. Unity中的UGUI源码解析之事件系统(9)-输入模块(下)

    Unity中的UGUI源码解析之事件系统(9)-输入模块(下) 接上一篇文章, 继续介绍输入模块. StandaloneInputModule类是上一篇文章介绍的抽象类PointerInputModu ...

  4. Unity中的UGUI源码解析之事件系统(6)-RayCaster(下)

    Unity中的UGUI源码解析之事件系统(6)-RayCaster(下) 接上一篇文章, 继续介绍投射器. GraphicRaycaster GraphicRaycaster继承于BaseRaycas ...

  5. Unity中的UGUI源码解析之事件系统(3)-EventData

    Unity中的UGUI源码解析之事件系统(3)-EventData 为了在事件系统中传递数据, Unity提供了EventData相关的类来封装这一类数据. 了解这些结构有助于我们对后面模块的学习. ...

  6. Unity中的UGUI源码解析之图形对象(Graphic)(2)-ICanvasElement

    Unity中的UGUI源码解析之图形对象(Graphic)(2)-ICanvasElement 在上一篇文章中, 我们对整个Graphic部分做了概述, 这篇文章我们介绍ICanvasElement和 ...

  7. elementui table某一列是否显示_elementui 中 loading 组件源码解析(续)

    上一篇我们说了elementui如何将loading组件添加到 Vue 实例上,具体内容见上期 elementui 中 loading 组件源码解析. 这一篇我们开始讲讲自定义指令 自定义指令 关于自 ...

  8. springsecurity sessionregistry session共享_要学就学透彻!Spring Security 中 CSRF 防御源码解析...

    今日干货 刚刚发表查看:66666回复:666 公众号后台回复 ssm,免费获取松哥纯手敲的 SSM 框架学习干货. 上篇文章松哥和大家聊了什么是 CSRF 攻击,以及 CSRF 攻击要如何防御.主要 ...

  9. 要学就学透彻!Spring Security 中 CSRF 防御源码解析

    上篇文章松哥和大家聊了什么是 CSRF 攻击,以及 CSRF 攻击要如何防御.主要和大家聊了 Spring Security 中处理该问题的几种办法. 今天松哥来和大家简单的看一下 Spring Se ...

最新文章

  1. 留念,第一次在C中调用lua成功!
  2. 自学python找到工作-学完python能找到工作么
  3. 5.16 12周第二课
  4. 同步方法 sleep和wait 线程同步的方法
  5. python自带的idle输入python_打开python自带IDLE出的问题
  6. python中函数的可变参数解析
  7. android 照片旋转并保存
  8. 音标与字母发音不同的字母总结
  9. php环境搭建及入门
  10. 基于卷积神经网络的人脸表情识别综述
  11. html小写罗马字符怎么写,如何在 LATEX 中插入大小写的罗马字符
  12. 英汉词典 JaVa_一个Java编写的英汉词典
  13. java生成vcf_Android vcard使用示例,生成vcf文件
  14. snapchat忘记账户_如何删除您的Snapchat帐户
  15. 战火与秩序迁城显示服务器忙,战火与秩序迁城方法介绍
  16. java 庖丁解牛中文分词_庖丁解牛中文分词包
  17. 【Maxent】最大熵的数学原理及其在推断问题中的应用
  18. FME2019试用过程
  19. 【微信小程序】学习笔记-----navigation-bar导航栏
  20. HT合泰 单片机的仿真调试

热门文章

  1. Warning: lio_listio returned EAGAIN Performance degradation may be seen
  2. C++ 删除字符串的首尾空字符
  3. JavaMail操作的总结(1)
  4. ListView列排序功能实现
  5. java字符类型的返回值,Java字符类isWhitespace()方法及示例
  6. python 实例化方法_Python中__new__()方法的使用和实例化
  7. C语言经典回溯算法之解决数的组合问题(详解)
  8. Python之数据分析(Numpy的矩阵相关操作、ufunc泛化函数对象)
  9. Python自定义词云图形状和文本颜色
  10. Python内置函数int()高级用法