router.options.routes 拿不到动态添加的路由,因其仅为初始化快照;应使用 router.getRoutes() 获取含所有静态与动态路由的实时列表。

router.options 拿不到动态添加的路由,根本原因在于它压根就不是为“动态更新”设计的——它是初始化快照,不是实时视图。
router.options 是一份只读的构造快照
Vue Router 实例(router)在创建时,会把传入的 routes 配置对象深拷贝或引用保存到 router.options.routes 中。这个属性的作用,仅限于记录“你当初给它什么”,后续所有 addRoute()、addRoutes() 操作都完全绕过 options,直接注入内部 matcher(匹配器)系统。
这就像你给快递公司填了一张初始收货地址表(options.routes),之后每次新增代收点,快递员(matcher)都记在自己随身小本上,但不会去涂改你那张原始表格。
真正生效的路由全量数据藏在 matcher 里
从 Vue Router 3.5.0 起,官方提供了标准 API:router.getRoutes()。它返回的是 matcher 当前维护的完整路由记录数组,包含所有静态 + 动态添加的路由,且保证顺序与实际匹配逻辑一致。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- ✅ 推荐用法:
const allRoutes = router.getRoutes() - ⚠️ 不要再依赖
router.options.routes做菜单渲染、权限比对等运行时逻辑 - ? 可验证:打印
router.getRoutes().length和router.options.routes.length,通常前者更大
为什么强行改写 options.routes 不推荐?
有人尝试手动拼接:router.options.routes = [...router.options.routes, ...newRoutes],虽然能“骗过”部分旧代码,但存在明显隐患:
- 破坏 Vue Router 内部状态一致性(比如 name 冲突检测、嵌套路由 parent 关系可能失效)
- 无法反映
addRoute()的精确插入位置(如 children 下添加 vs 顶层添加) - 若使用懒加载(
component: () => import(...)),options.routes 中的模块引用可能未正确初始化 - Vue Router 4+ 已彻底移除
addRoutes,统一用addRoute,更强调单条粒度控制,options 更不可变
响应式菜单渲染的正确姿势
侧边栏需要响应式更新?关键不在“能不能读到”,而在“什么时候读、从哪读、怎么驱动更新”:
- ✅ 在 store 中维护一份
permission_routes状态,由后端权限过滤后 commit 进来 - ✅ 组件内用
computed或watch监听该 state,触发 re-render - ✅ 渲染时调用
router.getRoutes()做最终校验(例如排除 hidden:true 或无权限项) - ✅ 切勿在 mounted 里一次性取
router.options.routes后缓存 —— 它不会响应后续 addRoute
不复杂但容易忽略:router.options 是历史档案,router.getRoutes() 才是当前工牌。用对地方,动态路由才真正“活”起来。


















