Vue3动态路由页面刷新找不到路由空白页面

本文讲述了作者在使用Vue3时遇到的动态路由刷新后丢失问题,通过console.log追踪发现与路由守卫有关。解决方案是调整获取动态路由的方式,使用async/await确保在注册路由之前完成数据获取,从而避免刷新时的空白页面问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.新年的第一天,作为一个刚用VUE3的菜鸟程序员遇到了一个获取用户权限动态路由的问题,如果不跳转刷新页面路由都能正常使用,但是一刷新页面通过  router.addRoute()添加的路由就会缺失,并且报路由找不到的警告。

 

 2.程序员快速解决bug的方法就是找度娘,但是这次度娘好像不给力了,我看到大多数大佬说的就是添加next({...to,replace: true}),我这里也是直接CV大法看问题解决了吗,结果发现还是不行,只要在动态路由上刷新页面就会变成空白页

 

 3.所以我们这采用常规解决问题的办法  console.log(),看看问题出现在什么地方,我发现控制台警告是比我打印前面的,而我打印是在路由守卫打印的,所以那么我们看看哪些地方引用了路由守卫,我的只有入口文件main.js,那么问题应该找到了在main.js中,如有我们在打印一下验证一下猜想。发现确实如此

 

 

 

4.现在我们来看看怎么解决呢, 我的办法就是用async和await调用一次获取动态路由的接口,因为我觉得这个问题应该是在获取动态路由前,vue就把先把路由给注册了所以获取不到,

 

 

5,现在我们看看问题解决了,能在动态路由刷新页面不出现空白页面或者动态路由没有的情况了,感谢看到这里的小伙伴,这是我第一次写文章因为看到度娘上没解决到我的问题,我自己解决了就分享出来看有没有遇到和我同样问题的,我出来工作才半年肯定有什么地方说的不对还请指正,最后麻烦一键三连,如果需要整个动态路由实现的方法也可以私信我,多的发我就发一个完整版的,谢谢

 

<think>好的,我现在需要解决用户在Vue3中遇到的动态路由页面刷新后出现空白的问题。首先,我得回顾一下用户提供的引用内容,看看其他开发者是怎么处理类似问题的。 根据引用[1],用户在Vue3中遇到动态路由刷新不到路由导致空白页。他们提到动态路由的实现方法,可能需要确保路由刷新后仍然存在。引用[2]指出,动态路由在第一次进入正常,但刷新空白,这可能是因为路由没有被正确持久化或重新加载。引用[3]则建议在首屏加载时请求动态路由并缓存,同时确保首页是静态路由,这样在刷新时可以从缓存中恢复路由。 接下来,我需要结合这些信息,整理出Vue3中的解决方案。Vue3使用Vue Router 4,可能的路由添加方式与Vue2不同。首先,动态路由应该在应用初始化时从持久化存储(如localStorage)中获取,并在路由配置前添加。这样可以确保刷新路由已经存在。 然后,权限验证守卫中,需要处理动态路由的加载。在用户登录后,获取路由数据并存储到localStorage,然后通过router.addRoute动态添加。但要注意,添加路由后可能需要跳转到目标路由或回到首页,避免空白。 另外,404页面的处理也很重要。如果动态路由未正确添加,访问不存在的路径会导致404,所以通配符路由应放在最后,确保其他路由先被匹配。 还要考虑路由缓存的时机,确保在应用启动时从缓存中读取路由,并在每次更新路由时更新缓存。同时,使用router.isReady()来等待路由就绪后再挂载应用,防止初始渲染时路由未加载完成。 可能的问题点包括:未正确使用addRoute方法,缓存时机不当,路由顺序错误,或者未处理路由重定向。需要逐一检查这些方面,确保动态路由刷新后能正确恢复,避免空白页。 最后,生成相关问题,帮助用户进一步理解和排查问题。比如如何持久化路由,如何处理404,如何优化加载速度等。</think>在Vue3中解决动态路由刷新后出现空白页的问题,需要结合路由持久化、初始化加载顺序和缓存策略。以下是具体解决方案: ### 一、核心解决步骤 1. **路由持久化存储** - 登录后立即将接口返回的动态路由数据存入`localStorage` ```typescript localStorage.setItem(&#39;dynamicRoutes&#39;, JSON.stringify(apiRoutes)) ``` 2. **初始化加载路由(关键)** ```typescript // router/index.ts const router = createRouter({...}) // 从缓存加载动态路由 const cachedRoutes = localStorage.getItem(&#39;dynamicRoutes&#39;) if (cachedRoutes) { const dynamicRoutes = JSON.parse(cachedRoutes) dynamicRoutes.forEach(route => { router.addRoute(route) // Vue3新增的API }) } ``` 3. **路由守卫处理** ```typescript router.beforeEach(async (to, from) => { if (!hasAuthToken()) return &#39;/login&#39; if (!hasLoadedRoutes) { const routes = await fetchRoutes() routes.forEach(route => router.addRoute(route)) localStorage.setItem(&#39;dynamicRoutes&#39;, JSON.stringify(routes)) return to.fullPath // 重定向到原始目标路径 } }) ``` 4. **确保首页静态化(必要前提)** ```typescript // 必须保证首页路由是静态声明 const staticRoutes = [ { path: &#39;/&#39;, component: Home }, { path: &#39;/login&#39;, component: Login } ] ``` ### 二、关键配置项 1. **404处理策略** ```typescript // 必须放在最后声明 { path: &#39;/:pathMatch(.*)*&#39;, component: NotFound, meta: { isDynamic: true } } ``` 2. **白屏防护措施** ```typescript // main.ts router.isReady().then(() => { app.mount(&#39;#app&#39;) }) ``` ### 三、优化方案 1. **路由缓存更新机制** ```typescript watch(router.getRoutes(), (newVal) => { localStorage.setItem(&#39;routeCache&#39;, JSON.stringify(newVal)) }, { deep: true }) ``` 2. **路由加载状态管理** ```typescript let isRouteLoaded = false router.beforeEach((to) => { if (!isRouteLoaded && to.path !== &#39;/login&#39;) { return { path: &#39;/loading&#39; } // 添加过渡页面 } }) ``` [^1][^2][^3]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值