问题描述:在实现根据角色权限动态添加路由的功能时,遇到了麻烦。本人动态添加路由的思路如下:在登录时去后端获取路由信息,然后动态添加,再跳转主页。这个实现思路让我成功跳转主页后能够使用添加的动态路由,然而,一旦刷新页面,添加的动态路由就会丢失。
解决过程:
1. 在index.ts中(本人的路由文件,router/index.ts,配置静态路由和路由守卫所在的文件),发现每次刷新页面整个index.ts文件会整个重新执行,而其他操作(页面的前进、后退等)则只会由于执行路由守卫。那么重点就是,利用整个页面刷新的这种特性,在index.ts中,路由守卫外,设置一个标志,来判断页面是否被刷新。一旦页面被刷新,说明动态路由丢失,需要重新添加。
2. 再判断完页面刷新后,还有一个问题,由于router.addRoute()是异步操作,在它没添加完成时,可能就执行了next()去跳转页面,此时就不能找到路由信息,还是会白屏。如下图
解决方法如下
当页面被刷新时,会触发路由守卫,此时count==1去执行了添加动态路由的方法,由于是异步操作,它没执行完就执行了next(to.fullPath),再次触发路由守卫,count++,等到重新回到这一个地方,异步操作已经完成了,路由添加完毕,此时count==2,不会执行if里面的动态路由添加方法,而是执行else里面的next直接跳转目标页面。问题彻底解决。
吐槽一句,网上找的解决方法大多无法解决,最后是在B站一个视频里找到的灵感,如果看不懂我的方法,可以去看看这个视频。贴一下视频链接:【vue3实战5.13-处理动态添加的路由刷新白屏】 https://www.bilibili.com/video/BV1QC4y1n7wK/?share_source=copy_web&vd_source=5c5e132774852e5a176f1d8cbb4c4134