使用return {...}
替代next({...})
虽然 Vue Router 仍然支持 next
方法,但确实不再推荐使用它,并且官方文档中也建议避免使用。在 Vue 3 中,你可以通过返回一个 Promise
或直接返回一个路由路径来处理导航守卫逻辑,而不必使用 next
方法。
以下是如何在全局导航守卫中实现 token 检查和重定向,而不使用 next
方法:
配置 Vue Router
在 src/router/index.js
中配置路由,并添加全局前置守卫:
|
|
解释
to
:目标路由对象,表示即将要进入的目标。from
:当前导航正要离开的路由。next
已被移除,替换为直接返回路由对象或true
。
改进的组件示例
在 src/views
目录中创建 Home.vue
和 Login.vue
文件,定义组件内容:
Home.vue
:
|
|
Login.vue
:
|
|
在 Vue 应用中使用路由器和 Pinia
在 src/main.js
中导入并使用路由器和 Pinia:
|
|
通过这种方式,你可以避免使用 next
方法,而是通过在导航守卫中返回路由路径或 true
来处理导航逻辑。这种方式更简洁,也避免了可能的错误来源。
添加动态路由
几个关键点
- 后端返回的菜单要转化为标准的路由记录数据类型
- 后端返回的嵌套菜单数据结构是否能直接通过
router.addRoute
方法添加:可以,但是后端返回的component
字段(前端组件路径)需要转换为实际的Vue组件
数据需要是标准的路由记录类型,才能被添加
官方参考:添加路由
标准的路由
to.matched
和to.meta
方法
在 Vue Router 中,route.meta
是一个有用的属性,它可以帮助你获取当前路由的合并的 meta 数据。这里的“非递归合并”指的是 Vue Router 在合并 meta
数据时并不会递归地处理所有父级路由的 meta
数据,而是直接将所有父级和子级路由的 meta
数据合并在一起。
route.meta
的功能和工作原理
-
路由记录的合并:
- 在 Vue Router 中,
route.matched
数组包含了当前路由匹配到的所有路由记录。这些记录包括了当前路由以及它的所有父级路由。 - 你可以遍历这个数组来手动提取和合并
meta
数据。每个路由记录的meta
数据可能会有不同的属性,这通常需要递归合并。
- 在 Vue Router 中,
-
非递归合并:
- Vue Router 提供了一个
route.meta
方法,它会将所有匹配的路由记录的meta
数据合并为一个单一的对象。合并是“非递归”的,意味着它不会深入到子路由中进一步合并,而是直接将所有父级和子级的meta
数据一并合成。 - 如果
meta
数据中存在相同的字段,后面定义的字段会覆盖前面的字段(类似于普通的对象合并)。
- Vue Router 提供了一个
示例
假设你有如下的路由配置:
|
|
对于匹配到的 /parent/child/grandchild
路由,route.matched
数组将包含:
/parent
/parent/child
/parent/child/grandchild
手动合并 meta
数据:
|
|
使用 Vue Router 的 route.meta
方法:
|
|
route.meta
合并后的结果:
|
|
总结
route.matched
数组包含了当前路由和所有父级路由的信息。- 非递归合并 指的是 Vue Router 将所有这些
meta
数据直接合并为一个对象,而不是递归地处理每个子路由的meta
。 route.meta
方法会合并所有匹配的路由记录的meta
数据,确保你可以方便地获取当前路由和所有父级路由的合并meta
数据。
全局前置守卫
怎么判断路由匹配成功?
to.matched
属性来判断是否有路由匹配成功。to.matched
是一个数组,包含所有与目标路由匹配的路由记录。你可以检查这个数组是否为空来判断是否有路由匹配成功。
设置动态路由
在全局前置路由守卫中添加逻辑,动态地添加或修改路由。
无论是否登录,对访问登录页的判断要放在前面
例如当已登录,尚未初始化动态路由时,初始化动态路由完成后,重新导航会一直访问登录页
已登录,但是未初始化动态路由时,访问登录页
在动态路由初始化完成之前,用户不能访问登录页或其他受限页面。
重新登录后,清空权限缓存
- hasInitDynamicRoute设为false
- 重置动态路由