简单实现前端动态路由
前言
通过后端接口的返回值,动态添加路由,是作为权限控制的一种常见方式,本文将简单讲解如何在Vue3中动态添加路由。
示例数据
1 |
|
思路分析
动态添加路由的实质,就是先将后端返回的json数据转化成一个个RouteRecordRaw
形式的对象,然后调用Vue Router的addRoute
方法,添加进路由列表中。由于每个路由地址都会对应一个Vue组件,因此还需要将Vue组件都通过import.meta.glob
读取到内存中。
具体实现函数
1 |
|
存在问题
路由何时处理?
笔者一开始认为,登录成功后立刻调用获取菜单的接口,然后处理路由,因此路由的处理应该在登录页面中的登录请求成功后进行处理,但是此时存在一个问题,用户登录成功进入后台页面,然后用户刷新页面,就会提示导航失败,控制台也会报错,因此笔者认为应该在登录成功进入后台页面之后开始处理。
笔者后台的主体页面框架为MainLayout
,因此笔者在此进行路由处理。
1 |
|
导航失败
⚠️
[Vue Router warn] : No match found for location with path "/dashboard"
这是因为路由跳转的时机要早于组件挂载,因此在组件挂载并处理路由前,路由就已经跳转并报错了。
笔者解决这个问题的思路有两个:
首先定义全局变量routeReady
,初始值为false
,当路由处理完成后变为true
-
在路由守卫
beforeEach
中判断,如果routeReady
为false
则处理路由,处理完成后跳转。 -
创建一个Loading页面,如果路由没有匹配的地址则跳转至Loading页面,并在该页面进行判断:
- 如果
routeReady
为true
,说明去往的地址并不在该用户的权限菜单中,转向404页面 - 如果
routeReady
为false
,则说明路由未加载完成,那么就在当前页面等待,等routeReady
为true
时,再执行上面的判断
- 如果
笔者这里用了方法2。
1 |
|
1 |
|
通过这种方式,可以在用户刷新页面后有一个顺滑的体验。
进入第一个路由
目前还存在一个问题,用户在登录跳转后,会进入后台页面,但是此时不会进入到任一菜单中:
而我们希望登录跳转后能自动进入到第一个菜单,即:
因此我们需要一个方法来找到第一个可用的路由:
1 |
|
然后调用这个方法即可:
1 |
|
后记
至此一个简单的动态路由就实现了,如果你有更好的意见或建议,欢迎留言交流。