index.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import Vue from 'vue'
  2. import Loading from './loading.vue'
  3. /**
  4. * Vue.extend 接受参数并返回一个构造器,new 该构造器可以返回一个组件实例
  5. * new Mask() 的时候,把该组件实例挂载到一个 div 上
  6. **/
  7. const Mask = Vue.extend(Loading)
  8. // 更新是否显示
  9. const toggleLoading = (el, binding) => {
  10. if (binding.value) {
  11. Vue.nextTick(() => {
  12. // 控制loading组件显示
  13. el.instance.visible = true
  14. el.style.position = 'relative'
  15. // 插入到目标元素
  16. insertDom(el, el)
  17. })
  18. } else {
  19. el.instance.visible = false
  20. el.style.position = 'static'
  21. el.mask && el.mask.parentNode && el.mask.parentNode.removeChild(el.mask)
  22. }
  23. }
  24. // 插入到目标元素
  25. const insertDom = (parent, el) => {
  26. parent.appendChild(el.mask)
  27. }
  28. export default {
  29. // 第一次绑定到元素时调用
  30. bind: function(el, binding, vnode) {
  31. const mask = new Mask({
  32. el: document.createElement('div'),
  33. data() {}
  34. })
  35. // 用一个变量接住mask实例
  36. el.instance = mask
  37. el.mask = mask.$el
  38. el.maskStyle = {}
  39. binding.value && toggleLoading(el, binding)
  40. },
  41. // 所在组件的 VNode 更新时调用--比较更新前后的值
  42. update: function(el, binding) {
  43. if (binding.oldValue !== binding.value) {
  44. toggleLoading(el, binding)
  45. }
  46. },
  47. // 指令与元素解绑时调用
  48. unbind: function(el, binding) {
  49. el.instance && el.instance.$destroy()
  50. }
  51. }