111 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
import Vue from 'vue';
 | 
						|
import loadingVue from './loading.vue';
 | 
						|
import { addClass, removeClass, getStyle } from 'element-ui/src/utils/dom';
 | 
						|
import { PopupManager } from 'element-ui/src/utils/popup';
 | 
						|
import afterLeave from 'element-ui/src/utils/after-leave';
 | 
						|
import merge from 'element-ui/src/utils/merge';
 | 
						|
 | 
						|
const LoadingConstructor = Vue.extend(loadingVue);
 | 
						|
 | 
						|
const defaults = {
 | 
						|
  text: '拼命加载中',
 | 
						|
  spinner:  'el-icon-loading',
 | 
						|
  background: 'rgb(0, 0, 0, .3)',
 | 
						|
  fullscreen: true,
 | 
						|
  body: false,
 | 
						|
  lock: false,
 | 
						|
  customClass: ''
 | 
						|
};
 | 
						|
 | 
						|
let fullscreenLoading;
 | 
						|
 | 
						|
LoadingConstructor.prototype.originalPosition = '';
 | 
						|
LoadingConstructor.prototype.originalOverflow = '';
 | 
						|
 | 
						|
LoadingConstructor.prototype.close = function() {
 | 
						|
  if (this.fullscreen) {
 | 
						|
    fullscreenLoading = undefined;
 | 
						|
  }
 | 
						|
  afterLeave(this, _ => {
 | 
						|
    const target = this.fullscreen || this.body
 | 
						|
      ? document.body
 | 
						|
      : this.target;
 | 
						|
    removeClass(target, 'el-loading-parent--relative');
 | 
						|
    removeClass(target, 'el-loading-parent--hidden');
 | 
						|
    if (this.$el && this.$el.parentNode) {
 | 
						|
      this.$el.parentNode.removeChild(this.$el);
 | 
						|
    }
 | 
						|
    this.$destroy();
 | 
						|
  }, 300);
 | 
						|
  this.visible = false;
 | 
						|
};
 | 
						|
 | 
						|
const addStyle = (options, parent, instance) => {
 | 
						|
  let maskStyle = {};
 | 
						|
  if (options.fullscreen) {
 | 
						|
    instance.originalPosition = getStyle(document.body, 'position');
 | 
						|
    instance.originalOverflow = getStyle(document.body, 'overflow');
 | 
						|
    maskStyle.zIndex = PopupManager.nextZIndex();
 | 
						|
  } else if (options.body) {
 | 
						|
    instance.originalPosition = getStyle(document.body, 'position');
 | 
						|
    ['top', 'left'].forEach(property => {
 | 
						|
      let scroll = property === 'top' ? 'scrollTop' : 'scrollLeft';
 | 
						|
      maskStyle[property] = options.target.getBoundingClientRect()[property] +
 | 
						|
        document.body[scroll] +
 | 
						|
        document.documentElement[scroll] +
 | 
						|
        'px';
 | 
						|
    });
 | 
						|
    ['height', 'width'].forEach(property => {
 | 
						|
      maskStyle[property] = options.target.getBoundingClientRect()[property] + 'px';
 | 
						|
    });
 | 
						|
  } else {
 | 
						|
    instance.originalPosition = getStyle(parent, 'position');
 | 
						|
  }
 | 
						|
  Object.keys(maskStyle).forEach(property => {
 | 
						|
    instance.$el.style[property] = maskStyle[property];
 | 
						|
  });
 | 
						|
};
 | 
						|
 | 
						|
const Loading = (options = {}) => {
 | 
						|
  if (Vue.prototype.$isServer) return;
 | 
						|
  options = merge({}, defaults, {text: '拼命加载中',
 | 
						|
    spinner:  'el-icon-loading',
 | 
						|
    background: 'rgb(0, 0, 0, .3)',});
 | 
						|
  if (typeof options.target === 'string') {
 | 
						|
    options.target = document.querySelector(options.target);
 | 
						|
  }
 | 
						|
  options.target = options.target || document.body;
 | 
						|
  if (options.target !== document.body) {
 | 
						|
    options.fullscreen = false;
 | 
						|
  } else {
 | 
						|
    options.body = true;
 | 
						|
  }
 | 
						|
  if (options.fullscreen && fullscreenLoading) {
 | 
						|
    return fullscreenLoading;
 | 
						|
  }
 | 
						|
 | 
						|
  let parent = options.body ? document.body : options.target;
 | 
						|
  let instance = new LoadingConstructor({
 | 
						|
    el: document.createElement('div'),
 | 
						|
    data: options
 | 
						|
  });
 | 
						|
 | 
						|
  addStyle(options, parent, instance);
 | 
						|
  if (instance.originalPosition !== 'absolute' && instance.originalPosition !== 'fixed') {
 | 
						|
    addClass(parent, 'el-loading-parent--relative');
 | 
						|
  }
 | 
						|
  if (options.fullscreen && options.lock) {
 | 
						|
    addClass(parent, 'el-loading-parent--hidden');
 | 
						|
  }
 | 
						|
  parent.appendChild(instance.$el);
 | 
						|
  Vue.nextTick(() => {
 | 
						|
    instance.visible = true;
 | 
						|
  });
 | 
						|
  if (options.fullscreen) {
 | 
						|
    fullscreenLoading = instance;
 | 
						|
  }
 | 
						|
  return instance;
 | 
						|
};
 | 
						|
 | 
						|
export default Loading;
 |