vue3增加loading页面

1,107 阅读1分钟

方式一 首屏加载,在index.html根文件下新增loading页面和样式

将内容写在<div id="app"></div>内,当远程静态资源加载完成后,app.mount('#app')挂载完成后替换原有的静态资源

<div id="Nloading">
      <div class="loading-contain">
        <img src="/loading.png" alt="loading" />
        <div class="loading-text">
          页面加载中,请稍等!
        </div>
        <div class="loading-loader">
          <div class='sk-three-bounce'>
            <div class='sk-bounce-1 sk-child'></div>
            <div class='sk-bounce-2 sk-child'></div>
            <div class='sk-bounce-3 sk-child'></div>
            <div class='sk-bounce-4 sk-child'></div>
            <div class='sk-bounce-5 sk-child'></div>
            <div class='sk-bounce-6 sk-child'></div>
          </div>
        </div>
      </div>
    </div>
     <style>
      #Nloading {
        width: 100%;
        height: 100vh;
        background-color: #F6F8FE;
      }

      #Nloading .loading-contain {
        position: absolute;
        top: 45%;
        left: 50%;
        -webkit-transform: translate3d(-50%, -45%, 0);
        transform: translate3d(-50%, -45%, 0);
        display: flex;
        align-items: center;
        justify-content: center;
        flex-direction: column;
        background-color: #F6F8FE;
      }

      #Nloading .loading-contain .loading-loader {
        padding-top: 15px;
      }
      #Nloading .loading-contain .loading-loader img {
        width: 297px;
        height: 256px;
      }
      #Nloading .loading-contain img {
        width: 297px;
        height: 256px;
      }

      #Nloading .loading-contain .loading-text {
        padding-top: 15px;
      }
    </style>

方式二 路由跳转 将loading页面以插件的形式挂载到vue的原型上

在路由跳转页面获取该项目实例,用实例上的挂载的loading页面属性去控制loading页面是否展示

import { createApp } from 'vue'
const instance = createApp(App)

instance.use(Loading)

type Lod = {
    show: () => void,
    hide: () => void
 }

// // 编写ts loading声明文件放置报错和提示
declare module '@vue/runtime-core' {
    export interface ComponentCustomProperties {
        $loading: Lod
    }
 }
 
 // 在路由跳转前
  instance?.config?.globalProperties?.$loading.show()
  //在路由跳转后
  instance?.config?.globalProperties?.$loading.hide()

loading页面

<template>
    <div id="Nloading" v-if="isShow">
        <div class="loading-contain">
            <img :src="loading" />
            <div class="loading-text">
                页面加载中,请稍等!
            </div>
        </div>
    </div>
</template>
<script lang="ts">
import { defineComponent } from "vue";
export default defineComponent({
    name: 'smallLoading'
})
</script>

<script setup lang="ts">
import { ref } from "vue"
const loading = new URL('@/assets/loading.png', import.meta.url).href

let isShow = ref(false)

const show = () => {
    isShow.value = true
}
const hide = () => {
    isShow.value = false
}
defineExpose({
    isShow,
    show,
    hide
})
</script>
<style lang="less" scope>
#Nloading {
    position: absolute;
    z-index: 9998;
    display: flex;
    justify-content: center;
    align-items: center;
    margin: auto;
    width: 100%;
    height: 100%;
    background-color: #F6F8FE;
    inset: 0;

    .loading-contain {
        position: relative;
        width: 100%;
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
        flex-direction: column;

        img {
            // position: absolute;
            // top: 50%;
            // left: 50%;
            // transform: translate3d(-50%, -50%, 0);
            width: 297px;
            height: 256px;
        }

        .loading-text {
            padding: 15px;
        }
    }

}
</style>