vue 全局loading

1,129 阅读1分钟

前言

有的时候接口数据量过大、需要加载一会、这个时候就需要做个loading等待、数据加载完成再 显示dom部分。

下面是一种loading的用法、当然还可以使用骨架屏方案

image.png

loading.vue

  <div>
    <div id="loader-wrapper" v-show="show">
      <div id="loader"></div>
      <div class="load_title">正在加载</div>
    </div>
  </div>
  
  props: {
    show: Boolean,
  },
  
  #loader-wrapper {
  position: fixed;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  z-index: 999999;
  background: #000;
  opacity: 0.8;
  .load_title {
    color: #4ea3fb;
    font-size: 18px;
    width: 100%;
    text-align: center;
    z-index: 9999999999999;
    position: absolute;
    top: 50%;
    opacity: 1;
    line-height: 30px;
    padding-top: 10px;
  }
 }
 #loader {
  display: block;
  position: relative;
  left: 50%;
  top: 40%;
  z-index: 1001;
  width: 90px;
  height: 90px;
  margin: -45px 0 0 -45px;
  border-radius: 50%;
  border: 3px solid transparent;
  border-top-color: #4ea3fb;
  -webkit-animation: spin 2s linear infinite;
  -ms-animation: spin 2s linear infinite;
  -moz-animation: spin 2s linear infinite;
  -o-animation: spin 2s linear infinite;
  animation: spin 2s linear infinite;
}
#loader:before {
  content: "";
  position: absolute;
  top: 5px;
  left: 5px;
  right: 5px;
  bottom: 5px;
  border-radius: 50%;
  border: 3px solid transparent;
  border-top-color: #4ea3fb;
  -webkit-animation: spin 3s linear infinite;
  -ms-animation: spin 3s linear infinite;
  -moz-animation: spin 3s linear infinite;
  -o-animation: spin 3s linear infinite;
  animation: spin 3s linear infinite;
 }
#loader:after {
  content: "";
  position: absolute;
  top: 15px;
  left: 15px;
  right: 15px;
  bottom: 15px;
  border-radius: 50%;
  border: 3px solid transparent;
  border-top-color: #4ea3fb;
  -webkit-animation: spin 1.5s linear infinite;
  -ms-animation: spin 1.5s linear infinite;
  -moz-animation: spin 1.5s linear infinite;
  -o-animation: spin 1.5s linear infinite;
  animation: spin 1.5s linear infinite;
}
@-webkit-keyframes spin {
  0% {
    -webkit-transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
    -ms-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}
@keyframes spin {
  0% {
    -webkit-transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
    -ms-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}
 

index.js

import Vue from 'vue'
import loadingComponent from './loading.vue'

const LoadingConstructor = Vue.extend(loadingComponent)

const instance = new LoadingConstructor({
    el: document.createElement('div')
})

instance.show = false // 默认隐藏
const loading = {
    show() { // 显示方法
        instance.show = true
        document.body.appendChild(instance.$el)
    },
    hide() { // 隐藏方法
        instance.show = false
    }
}

export default {
    install() {
        if (!Vue.$loading) {
            Vue.$loading = loading
        }
        Vue.mixin({
            created() {
                this.$loading = Vue.$loading
            }
        })
    }
}

main.js

import loading from '@/components/loading'

Vue.use(loading);

需要用到的地方调用办法

      this.$loading.show(); // 开启
      this.$loading.hide(); // 关闭