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)
    }
    
    为之则易,不为则难。
  • 相关阅读:
    javascript 3秒钟后自动跳转到前一页面
    meta
    HTML 5 label
    WCF的ABC
    由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面。
    ECMASCRIPT5新特性(转载)
    bin目录正.pdb是什么文件?
    PS切图的相关技巧
    MongoVUE破解方法
    ASP.NET MVC Area操作
  • 原文地址:https://www.cnblogs.com/coderDemo/p/14131971.html
Copyright © 2011-2022 走看看