Vue多级菜单动态路由核心是路由数据驱动菜单与组件递归渲染:路由嵌套配置+meta字段携带展示信息,MenuTree.vue递归遍历children生成菜单,动态注册需addRoute到layout容器并刷新菜单,跳转须router.push配合el-menu的:router="true"和default-active绑定$path。

Vue 动态路由处理多级菜单的递归生成与跳转,核心在于“路由数据驱动菜单”和“组件递归渲染”两个环节。关键不是手动写死所有层级,而是让菜单结构跟随路由配置自动展开,同时确保点击能准确跳转到对应路径。
路由配置需支持嵌套与元信息
多级菜单的前提是路由本身具备层级结构,并通过 meta 字段携带展示所需信息(如标题、图标、是否隐藏)。一级路由通常作为布局容器,子路由用 children 嵌套:
- 根路径
/对应 Layout 组件,不直接展示页面,只提供公共壳 - 每个业务模块(如权限管理)设为一个带
children的路由项,meta.title作为菜单主标题 - 子页面路由(如用户管理、角色管理)放在
children数组中,各自带meta.title和meta.icon - 避免在
children中再嵌套多层children—— Element Plus 的el-menu对三级以上折叠菜单支持不稳定,建议最多两级(顶部一级 + 左侧二级)
递归菜单组件封装要点
用一个独立的 MenuTree.vue 组件接收路由数组,内部通过 v-for 遍历并判断是否需要递归调用自身:
从零开始编排 SpringBoot+Vue 全栈项目工作流,适用于新建全栈项目或完整脚手架请求,触发后依次调用 product‑spec‑builder(需求调研)等模块。
- 遍历时检查当前路由项是否有
children且长度 ≥ 2:有则渲染为子菜单标题,再传入children数组递归调用自己 - 若无
children或仅有一个子项,直接渲染为可点击菜单项,绑定index为完整路径(如/acl/user) - 使用
key确保唯一性,推荐组合route.path + route.name,避免重复 key 导致渲染异常 - 图标、高亮状态、禁用逻辑都从
route.meta中读取,不额外维护菜单数据源
动态注册路由时保持菜单同步
当菜单由后端返回(非静态配置),需用 router.addRoute() 动态注入:
- 先定义好 Layout 路由作为父容器(
name: 'layout'),它不匹配具体路径,只作挂载点 - 后端返回菜单树后,将每条菜单数据转换为标准
RouteRecordRaw格式,调用router.addRoute('layout', routeConfig)注册到该容器下 - 注册完成后,菜单组件重新读取
router.options.routes或使用router.getRoutes()获取最新路由列表,触发更新 - 注意:addRoute 不会自动刷新已渲染的菜单,需配合
nextTick或响应式变量通知组件重绘
跳转与激活态必须严格匹配路径
菜单点击跳转不能只靠 router.push('/xxx'),还要确保 el-menu 的激活逻辑正确:
-
el-menu必须设置:router="true",否则不会自动响应路由变化 -
default-active应绑定当前完整路径($route.path),而非 name 或 hash - 若使用
redirect或别名路径,需在菜单项中显式使用to对象写法,例如{ path: '/acl', redirect: '/acl/user' },并在菜单中指向/acl/user才能激活 - 浏览器刷新后,需在
mounted或onMounted中主动设置default-active值,否则默认不激活
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









