Vue Router 面包屑导航通过 $route.matched 数组与路由 meta 动态生成,支持函数式标题、显隐控制、安全跳转及异步数据适配,无需手动维护或第三方插件。

Vue Router 实现面包屑导航与当前路由层级联动,核心是利用 $route.matched 数组天然反映嵌套匹配顺序的特性,结合路由元信息(meta)动态生成可点击、语义清晰、响应实时的路径链。不需手动维护结构,也不依赖第三方插件。
路由配置统一声明面包屑语义
每个参与面包屑的路由必须在 meta 中明确声明显示逻辑:
-
必填
title:用于展示文本,支持字符串或 i18n key,如meta: { title: '用户列表' } -
控制显隐用
breadcrumb: true/false:设为false可隐藏该层(如首页、登录页) -
动态标题推荐函数写法:对
/user/:id类路由,避免写死,改用函数延迟解析:meta: { breadcrumb: route => `用户详情 - ${route.params.id}` } -
嵌套路由每级独立配置:父子路由都要有各自的
meta.title,不能靠继承;$route.matched会按深度顺序返回全部匹配记录,第一项是根,最后一项是当前页
计算属性实时生成面包屑数组
在布局组件(如 Layout.vue)中定义计算属性,从 $route.matched 提取并加工:
Vue 3 组合式 API 与 最佳实践,涵盖代码组织、useXxx 模式、组合式函数设计、Store 集成、响应式优化及功能抽取。
- 过滤掉
meta.breadcrumb === false或存在redirect的记录 - 对每项执行
breadcrumb字段:若为函数则传入当前$route执行,否则直接取值 - 构造对象
{ title, path },其中path推荐用record.path(静态)或router.resolve({ name: record.name, params: record.params }).href(带参数安全) - 跳过通配符路由(
path === '*')和无实际组件的中间层(matched.length === 0)
支持点击跳转且路径有效
面包屑每一项都应可点击,但不是所有 matched 路由都对应真实页面:
立即学习“前端免费学习笔记(深入)”;
- 点击前调用
router.resolve()预检路径合法性,避免跳转失败或白屏 - 若校验失败(如子路由未加载、参数缺失),该项渲染为纯文本(非
<router-link>) - 跳转时统一用
router.push({ name, params, query }),而非拼接字符串,确保参数和查询参数完整保留 - 对动态参数页(如
/org/:orgId/dept/:deptId),点击上级时自动携带当前已有的params,无需额外处理
适配异步加载与真实数据标题
当某层标题需后端返回(如用户 ID 对应的真实姓名),不能仅靠 meta 静态定义:
- 在
beforeRouteEnter或setup()中请求接口,获取真实标题 - 更新
to.meta.title后触发视图重绘(Vue 3 中可通过next(vm => { vm.$route.meta.title = ... })或组合式 API 响应式更新) - 面包屑计算属性监听
$route.meta.title变化,自动刷新对应项 - 加载中可用占位符(如“加载中…”),避免空白或错乱


















