动手吧,vue2自定义全局loading

新建loading.vue, 用来写loading组件

<template>
  <div class="loading-mask flex-center-center">
    <svg viewBox="25 25 50 50" class="circular">
      <circle cx="50" cy="50" r="20" fill="none" class="path"></circle>
      <circle cx="50" cy="50" r="15" fill="none" class="path"></circle>
      <circle cx="50" cy="50" r="10" fill="none" class="path"></circle>
    </svg>
  </div>
</template>

<style lang="scss">
.flex-center-center {
  display: flex;
  align-items: center;
  justify-content: center;
}
.loading-mask {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  .circular {
    height: 35px;
    width: 35px;
    animation: loading-rotate 2s linear infinite;
    .path {
      animation: loading-dash 1.5s ease-in-out infinite;
      stroke-dasharray: 90, 150;
      stroke-dashoffset: 0;
      stroke-width: 2;
      stroke: #852acf;
      stroke-linecap: round;
      &:nth-of-type(2) {
        stroke-dasharray: 0, 90;
      }
      &:nth-of-type(3) {
        stroke-dasharray: 180, 270;
      }
    }
  }
}

@keyframes loading-rotate {
  100% {
    transform: rotate(1turn);
  }
}

@keyframes loading-dash {
  0% {
    stroke-dasharray: 1, 230;
    stroke-dashoffset: 0;
  }
  50% {
    stroke-dasharray: 90, 150;
    stroke-dashoffset: -40px;
  }
  100% {
    stroke-dasharray: 90, 150;
    stroke-dashoffset: -120px;
  }
}
</style>

新建loading.js , 用来构造loading实例,并挂载到body中

import Vue from "vue";

import loading from "@/components/loading/loading.vue";

let LoadingConstructor = Vue.extend(loading);

let instance;

let close_status = false;

let timer = null;

//设置自动关闭时长
const TIME = 8 * 1000;

const Loading = () => {
  close_status = false;

  if (instance) {
    removeChild();
  }

  instance = new LoadingConstructor();

  instance.$mount();

  document.body.appendChild(instance.$el);

  autoClose();

  return instance;
};

Loading.close = function() {
  close_status = true;

  removeChild();
};

function removeChild() {
  if (instance) {
    instance.$el.parentNode.removeChild(instance.$el);
    instance = null;
  }
}

//未关闭则自动关闭
function autoClose() {
  clearTimeout(timer);

  timer = setTimeout(() => {
    if (!close_status) {
      Loading.close();
    }
  }, TIME);
}

export default Loading;

这里自动关闭时长可根据请求超时时间来配置;通过Loading.close()主动关闭loading;

将loading方法挂载到Vue原型上

import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";
import Loading from "@/components/loading/loading.js";

Vue.config.productionTip = false;

Vue.prototype.$Loading = Loading;

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount("#app");

效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值