beforeEach中addRoutes后使用next()无法访问,路由未生效,刷新页面白屏,使用next({ ...to, replace: true })

查看路由表和匹配结果的方法
使用getRoutes()方法查看addroutes前后的路由表
使用to.matched查看匹配的路由
(vue router版本>=3.5.0)

问题描述:

使用addRoutes动态添加路由后,直接使用next(),无法访问路由,白屏。
输入日志分析:
在这里插入图片描述

问题分析

问题的关键在于遍历路由表的时机,由于对to的路由匹配结果在进入beforeEach之前就已经完成,使用的是addRoutes之前的路由表,匹配结果为空,并且在接下来的流程中匹配结果不变,执行next()时,放行的是空路由,导致白屏。

错误说法:
网上有说法称,addRoutes是异步执行,立刻执行next()addRoutes还未执行完毕,所以找不到路由,这是完全错误的。addRoutes表示我不背这个锅,你不重新遍历路由表怪谁。

因为我们在console中输出的日志,可以清晰的看到,在next()开始执行之前,路由表已经添加完毕并打印出来了,但是匹配结果仍然不变,因为又没有重新匹配,无论你等多长时间,也不会改变。

还有说是因为路由没生效,也不对,路由当时就添加进去了,添加进去就可用了,没有生不生效这一说。

问题解决

addRoutes后,不要使用next(),使用next(to),重新使用新的路由表进行匹配。
不过要注意,next(to)会再次进入beforeEach路由守卫,我们要设置判断逻辑,如果路由信息已经存在,就不再执行addRoutes,直接next()放行,才能跳转成功。不然会一直next(to),循环进入beforEach
同时,我们不希望之后每次刷新同一个页面,都重复插入相同的路由历史记录,可以加一个选项replace: true,使用替换模式来替换最新一条相同历史记录

if(路由信息已添加){
	// 直接放行
	next()
}
else{
	//添加动态路由信息
	addRoutes(xxx)
	//手动重新使用新路由表匹配目标
	next({ ...to, replace: true })
}

查看console日志,当再次进入beforeEach,我们可以看到使用的是新路由表,匹配结果不为空了。并且这次已经有用户路由信息了,直接next()放行
在这里插入图片描述

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!关于您提到的在使用 `router.beforeEach` 异步刷新页面时出现 404 错误的问题,我可以给您一些可能的解决方案。 首先,确保您的路由配置正确,并且在 `router.beforeEach` 使用了正确的异步逻辑。您可以在 `router.beforeEach` 使用 `await` 关键字来等待异步操作完成。例如: ```javascript router.beforeEach(async (to, from, next) => { // 异步操作,例如请求权限信息 await fetchPermissions(); // 继续导航 next(); }); ``` 另外,如果您在页面刷新时出现 404 错误,可能是因为在刷新页面时,服务器无法找到对应的资源。这可能是因为您使用了前端路由,但服务器端没有相应的路由配置。 为了解决这个问题,您可以在服务器端配置一个通配符路由,将所有的请求都指向前端入口文件。具体的配置方式取决于您使用的服务器,以下是一个示例: - 对于 Nginx 服务器,可以将以下配置添加到 `nginx.conf` 文件: ```nginx location / { try_files $uri $uri/ /index.html; } ``` - 对于 Apache 服务器,可以在 `.htaccess` 文件添加以下规则: ```apache <ifModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L] </ifModule> ``` 这样配置后,当访问不存在的页面时,服务器会将请求指向前端入口文件,然后由前端路由来处理路由逻辑。 希望这些解决方案能帮到您!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值