hookehuyr

refactor(router): 重构路由加载逻辑以优化用户体验

移除Suspense组件,改为在路由守卫中统一管理加载状态
添加路由错误处理确保加载状态正确重置
...@@ -7,19 +7,8 @@ ...@@ -7,19 +7,8 @@
7 --> 7 -->
8 <template> 8 <template>
9 <div id="app"> 9 <div id="app">
10 - <!-- 路由懒加载时的占位,避免白屏 --> 10 + <router-view />
11 - <router-view v-slot="{ Component }"> 11 + <!-- 全局loading蒙版 -->
12 - <Suspense>
13 - <component :is="Component" />
14 - <template #fallback>
15 - <div class="global-loading-overlay">
16 - <van-loading type="spinner" size="24px" color="#FFF" text-color="#FFF">加载中...</van-loading>
17 - </div>
18 - </template>
19 - </Suspense>
20 - </router-view>
21 -
22 - <!-- 全局loading蒙版(接口进行中显示) -->
23 <div v-if="is_loading" class="global-loading-overlay"> 12 <div v-if="is_loading" class="global-loading-overlay">
24 <van-loading type="spinner" size="24px" color="#FFF" text-color="#FFF">加载中...</van-loading> 13 <van-loading type="spinner" size="24px" color="#FFF" text-color="#FFF">加载中...</van-loading>
25 </div> 14 </div>
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
6 * @Description: 文件描述 6 * @Description: 文件描述
7 */ 7 */
8 import { createRouter, createWebHashHistory } from 'vue-router' 8 import { createRouter, createWebHashHistory } from 'vue-router'
9 +import { useLoadingStore } from '@/stores/loading.js'
9 10
10 const routes = [ 11 const routes = [
11 { 12 {
...@@ -58,26 +59,61 @@ const router = createRouter({ ...@@ -58,26 +59,61 @@ const router = createRouter({
58 * 说明:不使用平滑滚动,进入新页面时立即滚动到顶部,确保用户无感知的快速回到初始位置。 59 * 说明:不使用平滑滚动,进入新页面时立即滚动到顶部,确保用户无感知的快速回到初始位置。
59 */ 60 */
60 scrollBehavior(to, from, savedPosition) { 61 scrollBehavior(to, from, savedPosition) {
61 - if (savedPosition) { 62 + if (savedPosition) {
62 - return savedPosition 63 + return savedPosition
63 - } 64 + }
64 - return { left: 0, top: 0 } 65 + return { left: 0, top: 0 }
65 } 66 }
66 }) 67 })
67 68
68 // 路由守卫 69 // 路由守卫
69 router.beforeEach((to, from, next) => { 70 router.beforeEach((to, from, next) => {
70 - // 设置页面标题 71 + // 设置页面标题
71 - if (to.meta.title) { 72 + if (to.meta.title) {
72 - document.title = to.meta.title 73 + document.title = to.meta.title
73 - } 74 + }
75 +
76 + // 开启全局loading用于覆盖路由懒加载白屏
77 + /**
78 + * 开启路由级加载指示
79 + * @description 进入任意页面前先展示全局loading,避免异步组件/资源加载期间出现白屏
80 + */
81 + try {
82 + const loading = useLoadingStore()
83 + loading.start()
84 + } catch (e) {
85 + // 兜底:忽略异常,保证路由流程继续
86 + void e
87 + }
74 88
75 - // 这里可以添加权限验证逻辑 89 + // 这里可以添加权限验证逻辑
76 - next() 90 + next()
77 }) 91 })
78 92
79 -router.afterEach(() => { 93 +// 路由解析完成(异步组件与守卫均已完成)后关闭loading
80 - // 路由跳转后的逻辑 94 +/**
95 + * 关闭路由级加载指示
96 + * @description 在组件解析完成后关闭一次全局loading,剩余由接口加载计数继续控制
97 + */
98 +router.beforeResolve(() => {
99 + try {
100 + const loading = useLoadingStore()
101 + loading.end()
102 + } catch (e) {
103 + // 兜底:忽略异常,保证路由流程继续
104 + void e
105 + }
106 +})
107 +
108 +// 路由错误时重置loading,避免蒙版残留
109 +router.onError(() => {
110 + try {
111 + const loading = useLoadingStore()
112 + loading.reset()
113 + } catch (e) {
114 + // 兜底:忽略异常,保证路由流程继续
115 + void e
116 + }
81 }) 117 })
82 118
83 export default router 119 export default router
......