在项目中你提到用 Vue Router 实现全局导航生成,能否具体说明你是怎样依据路由配置文件来动态生成导航菜单的?
考察说明
考查候选人对 Vue Router 路由配置的利用能力以及动态生成导航菜单的思路与实现细节。
回答思路
- 【回答框架 1】导航菜单的生成通常基于路由配置中的 meta 信息,比如 title 和 icon,以及 children 结构。核心思路是遍历路由表,筛选出需要显示的顶级路由,再递归处理其子路由,映射成菜单需要的层级结构。
- 【回答框架 2】在 Vue Router 4 中,可以通过 router.options.routes 或 router.getRoutes() 获取路由表。router.options.routes 是原始配置,包含嵌套结构,适合用来生成树形菜单;getRoutes() 返回扁平化列表,包含匹配信息,但丢失层级,需要额外处理父子关系。
- 【回答框架 3】对于带权限的系统,还需结合用户权限或角色过滤路由,只保留有权限访问的菜单项;同时要处理隐藏菜单(meta.hidden)和一级菜单重定向等边界,确保菜单与实际可访问页面一致。
- 【回答框架 4】生成菜单数据后,通常交给 UI 组件递归渲染;需要考虑菜单项点击跳转与路由 active 状态的高亮绑定,以及动态路由变化时菜单的响应式更新。
- 【回答框架 5】实现时还可以将菜单生成逻辑抽成工具函数,输入路由配置和权限,输出菜单数组,便于测试和复用。
- 【关键点 1】通过遍历 router.options.routes 并读取 meta 来构建菜单树,保留嵌套层级。
- 【关键点 2】处理 meta.hidden、权限过滤和重定向,保证菜单项与实际可访问路由一致。
- 【关键点 3】使用递归组件或递归函数渲染多级菜单,并与当前路由联动高亮。
- 【易错点 1】不要直接使用 getRoutes() 生成树形菜单,因为它是扁平结构,会丢失父子层级。
- 【易错点 2】要处理路由嵌套与菜单展开联动,避免点击子菜单后父菜单未展开导致高亮失效。
- 【易错点 3】不要将不显示在侧边栏的中间路由(比如布局组件)也渲染成菜单项,需过滤或处理。