loading.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import Vue from 'vue';
  2. /**
  3. * 插入loading
  4. */
  5. const insertDom = (el) => {
  6. let dom = `<div class="el-loading-mask">
  7. <div class="el-loading-spinner">
  8. <svg viewBox="25 25 50 50" class="circular">
  9. <circle cx="50" cy="50" r="20" fill="none" class="path"> </circle>
  10. </svg>
  11. <p class="el-loading-text">拼命加载中...</p>
  12. </div>
  13. </div>`;
  14. //el添加相对定位
  15. el.classList.add('el-loading-parent--relative');
  16. // 插入到被绑定的元素内部
  17. el.insertAdjacentHTML('afterbegin', dom);
  18. };
  19. /**
  20. * 移除loading
  21. */
  22. const removeDom = (el) => {
  23. const ds = el.getElementsByClassName('el-loading-mask')[0];
  24. if (ds) {
  25. el.removeChild(ds);
  26. el.classList.remove('el-loading-parent--relative');
  27. }
  28. };
  29. // 更新是否显示
  30. const toggleLoading = (el, binding) => {
  31. if (binding.value) {
  32. insertDom(el);
  33. } else {
  34. removeDom(el);
  35. }
  36. };
  37. Vue.directive('loading', {
  38. bind: function (el, binding, vnode) {
  39. toggleLoading(el, binding);
  40. },
  41. //所在组件的 VNode 更新时调用--比较更新前后的值
  42. update: function (el, binding) {
  43. if (binding.oldValue !== binding.value) {
  44. toggleLoading(el, binding);
  45. }
  46. }
  47. });