vue3 动态路由-刷新页面或者首页redirect进入home页面不出来,提示404无法加载页面的解决办法

在Vue3应用中,当使用vue-router4进行动态路由配置后,页面刷新可能会导致找不到页面而显示空白。原因是vue-router4在添加路由后不会自动触发新的导航。为解决此问题,需要手动调用router.push或router.replace来加载页面。
问题

vue刷新页面或者首页通过redirect进入home页面,页面都是找不到不显示。
“vue”: “^3.2.47”,
“vue-router”: “^4.1.6”
找了好久发现是因为vue-router4 addRouter后不会触发新的导航,必须自己手动加载一遍。
router.push(to) or router.replace(to) 都可以。
在这里插入图片描述

参考

异步路由/动态路由配置后,页面刷新出现空白页或404的解决办法
vue-router4动态路由刷新404/白屏的解决

vue-router4.0动态路由失效问题

### Vue2 动态路由页面刷新后组件消失但菜单保留的解决方案 对于Vue2项目中遇到的动态路由设置下,当浏览器刷新时组件消失而仅留下菜单的问题,可以采取如下措施来解决: #### 1. 存储并恢复路由状态 为了确保在页面刷新之后仍然能够保持原有的导航结构以及对应的视图展示,可以在本地存储(如`localStorage`或`sessionStorage`)中保存当前用户的权限信息及其关联的路径配置。每次启动应用时先尝试读取这些缓存的数据,并基于此重建完整的路由表。 ```javascript // 将动态加载得到的路由规则持久化至 sessionStorage 中 const saveRoutesToSession = (routes) => { sessionStorage.setItem('dynamic_routes', JSON.stringify(routes)); }; // 启动时从 sessionStorage 获取之前保存下来的路由定义 function loadSavedRoutes() { const savedRoutesStr = sessionStorage.getItem('dynamic_routes'); let routes; try { routes = JSON.parse(savedRoutesStr); } catch (_) {} return routes || []; } ``` #### 2. 初始化阶段同步路由 在应用程序初始化期间,应该主动向服务器请求最新的访问控制列表ACL(Access Control List),并将获得的结果转换成适合Vue Router使用的格式。接着调用`router.addRoutes()`方法把新的条目加入现有的静态路由集合里[^1]。 ```javascript import { createRouter, createWebHistory } from 'vue-router'; import store from './store'; let router; async function initDynamicRoutes() { // 假设这里会返回一个 Promise 对象,其中包含了来自 API 的响应数据 const aclResponse = await fetch('/api/get_acl'); if (!aclResponse.ok) throw new Error(`Failed to get ACL: ${await aclResponse.text()}`); const dynamicRouteConfigurations = await aclResponse.json(); // 添加自定义逻辑处理以适应具体业务需求... } initDynamicRoutes().then(() => { router = createRouter({ history: createWebHistory(), routes: [ ...staticRoutes, ...(loadSavedRoutes()) ] }); app.use(router).mount('#app'); }); ``` #### 3. 处理未匹配到任何已知路径的情况 如果用户直接输入URL地址栏里的链接或者强制刷新了某个子页面,则可能出现找到对应资源的情形。此时可以通过监听全局错误事件的方式捕获此类异常状况,并重定向回首页或者其他默认位置;也可以考虑预先注册一条通配符模式下的兜底规则用于应对未知情况的发生[^2]。 ```javascript router.beforeEach((to, from, next) => { // 如果发现存在于现有记录内的 URL 请求, // 则重新拉取最新版的 ACL 并更新内部状态机。 if (!hasMatchingPath(to.path)) { initDynamicRoutes() .catch(err => console.error(err)) .finally(() => next({ name: 'home' })); return; } next(); }); // 或者是在 route 配置数组最后面追加一个 * 号作为占位符 { path: '*', redirect: '/not-found' } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值