zoukankan      html  css  js  c++  java
  • Vue 服务式Loading组件

    components 下 loading 下 Loading.vue

    <template>
      <transition name="fade">
        <div class="loading_container" v-show="visible">
          <div class="loading_wrapper">
            <div class="sk-folding-cube">
              <div class="sk-cube1 sk-cube"></div>
              <div class="sk-cube2 sk-cube"></div>
              <div class="sk-cube4 sk-cube"></div>
              <div class="sk-cube3 sk-cube"></div>
            </div>
            <div class="loading_title">{{ title }}</div>
          </div>
        </div>
      </transition>
    </template>
    
    <script>
    export default {
      name: 'Loading',
      data() {
        return {
          visible: false
        }
      },
      props: {
        title: {
          type: String,
          default: 'loading'
        }
      },
      watch: {
        visible(val) {
          document.body.style.overflow = val ? 'hidden' : null
        }
      }
    }
    </script>
    
    <style scoped lang="scss">
    .fade-enter,
    .fade-leave-to {
      opacity: 0;
    }
    
    .fade-enter-active,
    .fade-leave-active {
      transition: opacity .6s ease;
    }
    
    @keyframes sk-foldCubeAngle {
      0%, 10% {
        transform: perspective(140px) rotateX(-180deg);
        opacity: 0;
      }
      25%, 75% {
        transform: perspective(140px) rotateX(0deg);
        opacity: 1;
      }
      90%, 100% {
        transform: perspective(140px) rotateY(180deg);
        opacity: 0;
      }
    }
    
    .loading_container {
      position: fixed;
      z-index: 1000;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      display: flex;
      justify-content: center;
      align-items: center;
      pointer-events: none;
    
      .loading_wrapper {
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
         120px;
        height: 120px;
        background-color: rgba(0, 0, 0, .8);
        border-radius: 6px;
      }
    
      .loading_title {
        overflow: hidden;
         100%;
        box-sizing: border-box;
        padding: 0 10px;
        font-size: 14px;
        line-height: 2em;
        color: #fff;
        text-align: center;
        white-space: nowrap;
        text-overflow: ellipsis;
      }
    
      .sk-folding-cube {
         24%;
        height: 24%;
        margin: 16px 0;
        position: relative;
        transform: rotateZ(45deg);
    
        .sk-cube {
          float: left;
           50%;
          height: 50%;
          position: relative;
          transform: scale(1.1);
    
          &:before {
            content: '';
            position: absolute;
            top: 0;
            left: 0;
             100%;
            height: 100%;
            animation: sk-foldCubeAngle 2.4s infinite linear both;
            transform-origin: 100% 100%;
            background-color: #fff;
          }
        }
    
        .sk-cube2 {
          transform: scale(1.1) rotateZ(90deg);
    
          &:before {
            animation-delay: .3s;
          }
        }
    
        .sk-cube3 {
          transform: scale(1.1) rotateZ(180deg);
    
          &:before {
            animation-delay: .6s;
          }
        }
    
        .sk-cube4 {
          transform: scale(1.1) rotateZ(270deg);
    
          &:before {
            animation-delay: .9s;
          }
        }
      }
    }
    </style>
    

    components 下 loading 下 index.js

    import LoadingComponent from './Loading'
    
    let loadingInstance = null // 单例
    
    const Loading = {
      install(Vue) {
        Vue.prototype.$loading = {
          show(title = 'loading') {
            if (!loadingInstance) {
              const LoadingConstructor = Vue.extend(LoadingComponent)
              loadingInstance = new LoadingConstructor({
                props: {
                  title: {
                    type: String,
                    default: title
                  }
                }
              }).$mount() // 调用$mount 得到真实dom
              document.body.appendChild(loadingInstance.$el)
            }
            if (!loadingInstance.visible) loadingInstance.visible = true
          },
    
          hide() {
            if (loadingInstance?.visible) loadingInstance.visible = false
          }
        }
      }
    }
    
    export default Loading
    

    main.js

    impotarnt Loading form './components/loading'
    
    Vue.use(Loading)
    

    demo

    // 组件中
    showLoading() {
      this.$loading.show('加载中...')
      setTimeout(() => {
        this.$loading.hide()
      }, 2000)
    }
    
    为之则易,不为则难。
  • 相关阅读:
    C++笔记(2018/2/6)
    2017级面向对象程序设计寒假作业1
    谁是你的潜在朋友
    A1095 Cars on Campus (30)(30 分)
    A1083 List Grades (25)(25 分)
    A1075 PAT Judge (25)(25 分)
    A1012 The Best Rank (25)(25 分)
    1009 说反话 (20)(20 分)
    A1055 The World's Richest(25 分)
    A1025 PAT Ranking (25)(25 分)
  • 原文地址:https://www.cnblogs.com/coderDemo/p/14131971.html
Copyright © 2011-2022 走看看