feat(screen): 为路由初始化添加加载指示器
添加加载旋转器以防止路由加载期间出现白屏。确保路由器准备就绪后再显示内容,并包含错误处理以避免永久白屏。包含旋转器动画的CSS。
This commit is contained in:
parent
d9e326de18
commit
135db364b6
@ -2,24 +2,39 @@
|
|||||||
<div id="app">
|
<div id="app">
|
||||||
<template v-if="pageLoaded">
|
<template v-if="pageLoaded">
|
||||||
<template v-if="!route.meta.screen">
|
<template v-if="!route.meta.screen">
|
||||||
<Index ></Index>
|
<Index></Index>
|
||||||
</template>
|
</template>
|
||||||
<router-view v-else></router-view>
|
<router-view v-else></router-view>
|
||||||
</template>
|
</template>
|
||||||
|
<!-- 路由加载中的指示器,避免白屏 -->
|
||||||
|
<div v-else class="loading-container">
|
||||||
|
<div class="loading-spinner"></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
import { useRoute } from 'vue-router'
|
import { useRoute, useRouter } from 'vue-router'
|
||||||
import Index from "./views/index.vue";
|
import Index from "./views/index.vue";
|
||||||
import { onMounted } from 'vue';
|
import { onMounted } from 'vue';
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
const router = useRouter()
|
||||||
const pageLoaded = ref(false)
|
const pageLoaded = ref(false)
|
||||||
onMounted(() => {
|
|
||||||
setTimeout(()=>{
|
onMounted(async () => {
|
||||||
|
try {
|
||||||
|
// 等待路由完全准备好,确保 route.meta 已正确加载
|
||||||
|
// 这样可以避免大组件懒加载时的竞态条件问题
|
||||||
|
await router.isReady()
|
||||||
|
} catch (error) {
|
||||||
|
// 即使路由加载失败,也要显示页面,避免永久白屏
|
||||||
|
console.error('路由初始化失败:', error)
|
||||||
|
} finally {
|
||||||
|
// 无论成功或失败,都设置 pageLoaded 为 true
|
||||||
pageLoaded.value = true
|
pageLoaded.value = true
|
||||||
}, 50)
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -29,4 +44,28 @@ onMounted(() => {
|
|||||||
height: 100vh;
|
height: 100vh;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loading-container {
|
||||||
|
width: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background-color: #0a0e27;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading-spinner {
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
border: 4px solid rgba(255, 255, 255, 0.1);
|
||||||
|
border-top-color: #409eff;
|
||||||
|
border-radius: 50%;
|
||||||
|
animation: spin 1s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
to {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user