Breadcrumb
概述
Breadcrumb(面包屑)允许用户按照页面层级结构进行导航,展示当前在应用结构中的位置。
功能
- 数据驱动的 compact 组合 —
SBreadcrumb从items数组渲染条目;AriaBreadcrumbCompact负责迭代、默认内容与内部组合(root → list → items → separators)。 - 链接 vs 当前页 — 带
to/href的条目渲染为BreadcrumbLink(复用 Link 原语);末尾无目标条目的渲染为BreadcrumbPage,带aria-current="page"与aria-disabled。 - 省略号折叠 —
ellipsis: true在条目数 ≥5 时将所有中间条目折叠为省略号;ellipsis: [start, end]支持自定义折叠范围(自动归一化:start 0 → 1、end length → length - 1)。 - 带条目数据的点击事件 —
click事件携带完整的被激活条目对象;disabled 条目永不触发。 - 完整 ARIA 语义 —
nav携带本地化aria-label;分隔符与省略号为role="presentation"+aria-hidden;当前页使用aria-current="page"。 - 区域级属性透传 —
listProps、itemProps、linkProps、pageProps、separatorProps、ellipsisProps透传属性到各区域。 - 八个自定义槽 —
default、ellipsis、ellipsis-icon、separator、item-leading、item-link、item-label、item-trailing,带类型化的 scoped props(item、index、ellipsisItems)。 - 图标支持 — 每个条目可携带
icon(经item-leading槽默认内容渲染),使用IconValue类型。 - 禁用条目 — 条目上的
disabled: true会禁用链接并抑制 click 事件。 - 尺寸缩放 —
size(xs…2xl)经breadcrumbVariants缩放字号与间距。 - Aria 组合 —
BreadcrumbRoot/BreadcrumbList/BreadcrumbItem/BreadcrumbLink/BreadcrumbPage/BreadcrumbSeparator/BreadcrumbEllipsis从@vean/aria/breadcrumb导出,可完全自定义样式构建。
用法
SBreadcrumb将列表聚合委托给 AriaBreadcrumbCompact。如需无样式的数据驱动组合,请从@vean/aria/breadcrumb导入BreadcrumbCompact。
演示
基础
分隔符
链接
条目下拉
省略下拉
API
Aria 层
11Breadcrumb<T>
属性
| 属性名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
class | ClassValue | — | 根类 |
size | ThemeSize | — | 组件的视觉尺寸。 |
ui | Partial<BreadcrumbUi> | — | 该组件的按槽类重写。 |
items | T[] | — | 由该组件渲染的项。 |
ellipsis | true | [number, number] | null | — | 显示省略号的项目范围。
当项目数量超过 4 个时,将显示省略号。 |
listProps | BreadcrumbListProps | — | 转发给列表元素的属性。 |
itemProps | BreadcrumbItemProps | — | 转发给 item 元素的属性。 |
linkProps | LinkExtraProps | — | 传递给 link 元素的属性。 |
pageProps | BreadcrumbPageProps | — | 转发给页面元素的属性。 |
separatorProps | BreadcrumbSeparatorProps | — | 转发给分隔符元素的属性。 |
ellipsisProps | BreadcrumbEllipsisProps | — | 转发给省略号元素的属性。 |
事件
| 事件名 | 参数 | 描述 |
|---|---|---|
click | T | 在发生点击时触发。 |
插槽
| 插槽名 | 参数 | 描述 |
|---|---|---|
default | BreadcrumbCompactItemSlotProps<T> | 默认插槽的自定义内容。 |
ellipsis | BreadcrumbCompactEllipsisSlotProps<T> | 省略号位置的自定义内容。 |
ellipsis-icon | — | 省略号图标位置的自定义内容。 |
separator | — | 分隔符槽位的自定义内容。 |
item-leading | BreadcrumbCompactItemSlotProps<T> | 用于项目引导槽位的自定义内容。 |
item-link | BreadcrumbCompactItemSlotProps<T> | 项目链接槽位的自定义内容。 |
item-label | BreadcrumbCompactItemSlotProps<T> | 针对项目标签插槽的自定义内容。 |
item-trailing | BreadcrumbCompactItemSlotProps<T> | 用于项目尾部槽位的自定义内容。 |
BreadcrumbCompact<T>
属性
| 属性名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
items | T[] | — | 由该组件渲染的项。 |
ellipsis | true | [number, number] | null | — | 显示省略号的项目范围。
当项目数量超过 4 个时,将显示省略号。 |
listProps | BreadcrumbListProps | — | 转发给列表元素的属性。 |
itemProps | BreadcrumbItemProps | — | 转发给 item 元素的属性。 |
linkProps | LinkExtraProps | — | 传递给 link 元素的属性。 |
pageProps | BreadcrumbPageProps | — | 转发给页面元素的属性。 |
separatorProps | BreadcrumbSeparatorProps | — | 转发给分隔符元素的属性。 |
ellipsisProps | BreadcrumbEllipsisProps | — | 转发给省略号元素的属性。 |
事件
| 事件名 | 参数 | 描述 |
|---|---|---|
click | T | 在发生点击时触发。 |
插槽
| 插槽名 | 参数 | 描述 |
|---|---|---|
default | BreadcrumbCompactItemSlotProps<T> | 默认插槽的自定义内容。 |
ellipsis | BreadcrumbCompactEllipsisSlotProps<T> | 省略号位置的自定义内容。 |
ellipsis-icon | — | 省略号图标位置的自定义内容。 |
separator | — | 分隔符槽位的自定义内容。 |
item-leading | BreadcrumbCompactItemSlotProps<T> | 用于项目引导槽位的自定义内容。 |
item-link | BreadcrumbCompactItemSlotProps<T> | 项目链接槽位的自定义内容。 |
item-label | BreadcrumbCompactItemSlotProps<T> | 针对项目标签插槽的自定义内容。 |
item-trailing | BreadcrumbCompactItemSlotProps<T> | 用于项目尾部槽位的自定义内容。 |
BreadcrumbCompactEllipsis
BreadcrumbCompactItem
BreadcrumbEllipsis
BreadcrumbItem
BreadcrumbLink
属性
| 属性名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
to | string | import("vue-router").RouteLocationAsRelativeGeneric | import("vue-router").RouteLocationAsPathGeneric | — | Route Location:点击该链接后应跳转到的位置。 |
replace | boolean | — | 调用 `router.replace` 而不是 `router.push`。 |
href | string | — | 点击链接时应跳转到的 URL。 |
disabled | boolean | — | 当值为 `true` 时,该链接将被禁用。 |
activeClass | string | — | 当链接处于活动状态时应用的类 |
exactActiveClass | string | — | 当链接完全有效时应用的类 |
inactiveClass | string | — | 链接处于非活动状态时应应用的类。 |
prefetchedClass | string | — | 一个用于标记已预取链接的类。 |
external | boolean | — | 强制将链接视为外部链接(true)或内部链接(false)。这有助于处理边界情况 |
ariaCurrentValue | 'true' | 'false' | 'page' | 'date' | 'time' | 'step' | 'location' | `'page'` | 当链接处于活动状态时,传递给 `aria-current` 属性的值。 |
viewTransition | boolean | — | 如果支持,请将 `router.push()` 返回的 Promise 传递给 `document.startViewTransition()`。 |
target | (string & {}) | '_blank' | '_parent' | '_self' | '_top' | null | — | 将链接的 URL 作为浏览上下文的名称显示在何处。 |
rel | (string & {}) | 'noopener' | 'noreferrer' | 'nofollow' | 'sponsored' | 'ugc' | null | 'noopener noreferrer' | 应用于链接的 rel 属性值。对于外部链接,默认值为“noopener noreferrer”。 |
noRel | boolean | — | 如果设置为 true,则不会在链接中添加 rel 属性 |
prefetch | boolean | — | 启用后,将预取视口内链接的中间件、布局和有效载荷。 |
prefetchOn | 'visibility' | 'interaction' | Partial<{ visibility: boolean; interaction: boolean; }> | — | 允许控制何时预取链接。默认情况下,仅在可见性发生变化时才会触发预取。 |
noPrefetch | boolean | — | 用于禁用 `prefetch` 属性的逃逸机制。 |
trailingSlash | 'append' | 'remove' | — | 一个用于在此特定链接的 `href` 中添加或移除尾部斜杠的选项。
如果提供了此选项,将覆盖全局 `trailingSlash` 选项。 |
asChild | boolean | — | 将默认渲染元素替换为作为子元素传递的元素,并合并两者的属性及行为。 |
as | AsTag | Component | 'div' | 该组件应渲染为的元素或组件。可通过 `asChild` 进行覆盖。 |
BreadcrumbList
BreadcrumbPage
BreadcrumbRoot
BreadcrumbSeparator
注意事项
架构与行业对标
| 关注点 | VeanUI | shadcn-vue Breadcrumb | Ant Design Breadcrumb | Element Plus Breadcrumb |
|---|---|---|---|---|
| Aria / 样式分离 | ✅ @vean/aria/breadcrumb + scv() | ❌ 单一包 | ❌ 单一包 | ❌ 单一包 |
| 数据驱动 compact API | ✅ items + ellipsis + click | ❌ 仅槽/组件组合 | ✅ routes / items | ✅ breadcrumb-item 循环 |
| 省略号折叠 | ✅ true(≥5 条)或自定义 [start, end] | ❌ 手动省略号条目 | ✅ ellipsis(≥4 条) | ❌ 手动 |
| 链接 vs 当前页 | ✅ to/href → Link;末尾 → aria-current 页 | ✅ 独立 BreadcrumbLink/BreadcrumbPage | ✅ 末尾项即当前页 | ✅ 末尾项自动当前 |
| 携带数据的点击事件 | ✅ click(item);disabled 抑制 | ❌ 仅原生链接 | ✅ onClick(route) | ✅ select 事件 |
| 禁用条目 | ✅ 条目数据上的 disabled | — | ✅ | — |
本地化 aria-label | ✅ locale 注册表 | 硬编码 | 仅 itemRender | — |
| 区域级属性透传 | ✅ 6 组 props | 各部件 asChild | itemRender | separator 槽 |
| 自定义槽 | ✅ 8 个类型化槽 | ✅ 5 部件 + separator 槽 | itemRender | ✅ separator / title 槽 |
| 尺寸缩放 | ✅ xs…2xl | ✅ 固定 | ✅ size | — |
运行时注意事项
- 省略号索引数学 —
getEllipsisRange在条目 <5 时返回null;true对应[1, len-2];用户范围被归一化(start 0 → 1、end length → length - 1)以保证首尾条目始终可见。 - 省略号位置 — 折叠的省略号渲染在新数组索引等于
start的位置,即首个折叠后可见条目之前;省略号后跟随一个分隔符。 - 禁用点击抑制 —
handleItemClick忽略disabled: true的条目,因此click事件永不携带禁用条目(链接点击也被 Link 原语拦截)。 - 链接路由 —
BreadcrumbLink继承 Link 原语,to(router-link)与href/external(锚点)均可用;target生效。 - 当前页语义 — 末尾无
to/href的条目渲染为BreadcrumbPage(role="link"+aria-disabled="true"+aria-current="page"),辅助技术用户可识别其不可导航。 - Locale 回退 —
nav的aria-label来自useLocaleMessages;缺失的 locale 键回退到默认英文包。
常见问题
省略号何时出现?
使用 ellipsis: true 时,仅当条目数 ≥5 才渲染省略号;首尾条目始终可见,中间折叠。使用 ellipsis: [start, end] 可精确指定折叠范围(两个端点均被归一化以保持边缘可见)。
如何区分链接条目与当前页?
带 to(路由)或 href/external(锚点)的条目渲染为链接。末尾无目标的条目渲染为带 aria-current="page" 的当前页。若要让非末尾条目也显示为纯标签,请省略其 to/href。
为什么点击 disabled 条目不触发任何事件?
禁用条目有意保持惰性:链接被 Link 原语禁用,compact 组件对 disabled: true 条目抑制 click 事件,符合预期的面包屑行为。
可以自定义分隔符吗?
可以 — 使用 separator 槽。每个分隔符(含省略号后的那个)都会渲染你的内容。如需区域级样式,可传入 separatorProps 或 ui 配方类。
条目槽接收哪些 scoped props?
item-leading、item-link、item-label、item-trailing 与默认槽接收 { item, index };ellipsis 槽接收 { ellipsisItems }。UI wrapper 原样转发给你的自定义槽内容。
面包屑可访问吗?
可以 — 根为带本地化 aria-label 的 nav,列表为 ol,分隔符与省略号对辅助技术隐藏,当前页通过 aria-current="page" 播报。
可以构建完全自定义的面包屑吗?
可以 — 用 @vean/aria/breadcrumb 组合 BreadcrumbRoot / BreadcrumbList / BreadcrumbItem / BreadcrumbLink / BreadcrumbPage / BreadcrumbSeparator / BreadcrumbEllipsis,并通过 provideBreadcrumbUi(或 SBreadcrumb 的 ui prop)注入样式。