Skip to content

Menu 菜单

xy-menu 用于承接站点主导航、后台侧栏、工作台模块切换和资源入口列表。采用 xy-menu / xy-sub-menu / xy-menu-item / xy-menu-item-group 的插槽式子组件结构,并支持受控状态和 items 数据驱动能力。

样式定制优先通过菜单根节点或 popper-class 对应根节点覆写公开 CSS 变量,不建议直接依赖 .xy-menu__* 这类内部结构类。例如:

css
.your-menu-shell {
  --xy-menu-horizontal-height: 64px;
  --xy-menu-item-radius: 12px;
  --xy-menu-hover-shadow: inset 0 0 0 1px var(--xy-border-subtle);
}

.your-menu-popup {
  --xy-menu-popup-min-width: 240px;
  --xy-menu-group-title-padding: 8px 14px 10px;
}

顶部横向菜单

顶部导航适合搭配工作台、订单、设置等一级入口。横向模式下支持 hover 或 click 打开子菜单。

基础用法横向菜单

横向菜单适合放在页面顶部,作为主导航使用,支持下拉子菜单。

左右分区导航

不新增组件 prop,只通过示例级样式把品牌入口固定在左侧,把工作区和操作入口推到右侧。

左右对齐Left / Right

左侧固定导航,右侧放置用户信息、通知等操作入口。

侧栏纵向菜单

纵向模式适合后台侧栏。默认激活项会自动展开它的祖先路径,菜单分组也适合做模块内的功能分区。

纵向菜单Vertical

纵向菜单适合放在页面左侧,作为侧边导航使用。

折叠菜单

折叠只在纵向模式下生效。折叠后一级菜单会缩成图标列,子菜单通过弹出层呈现。

菜单折叠Collapse

设置 collapse 属性可以折叠菜单为图标模式,适合空间有限的场景。

已展开

受控状态

通过 active-indexopened-menus 和对应的 update:* 事件,可以把菜单状态交给外部业务层维护。

受控模式Controlled

通过 active-index 和 opened-menus 控制菜单状态,支持 update 事件同步。

items 数据驱动菜单树

items 适合后台业务直接从配置生成菜单树。若同时传 items 和默认插槽,会优先渲染默认插槽,并在开发环境给出提示。

数据驱动Items

通过 items 属性配置菜单数据,支持图标、徽章、额外文本和权限过滤。

横向溢出与 Popper Offset

当横向菜单宽度不足时,会把超出的一级项收进“更多”入口。这个示例也演示了菜单级和子菜单级的 popper-offset

菜单溢出Ellipsis

设置 ellipsis 属性,超出容器的菜单项会收进「更多」下拉中。

何时使用

  • 需要一套声明式导航结构,而不是把导航树手写成普通列表。
  • 需要在纵向模式里管理展开状态、唯一展开和默认激活项。
  • 需要在横向模式下承接一级导航与二级弹出菜单。
  • 需要在业务层直接控制激活项、展开项,或者从配置数据动态生成导航树。

样式变量

常用定制点可直接在 xy-menu 根节点或 popper-class 根节点覆写以下变量:

变量说明默认值
--xy-menu-padding菜单根容器内边距8px
--xy-menu-gap根容器子项间距6px
--xy-menu-border菜单根容器边框none
--xy-menu-radius菜单根容器圆角var(--xy-radius-lg)
--xy-menu-horizontal-height横向菜单高度56px
--xy-menu-horizontal-item-min-height横向一级项最小高度calc(var(--xy-menu-horizontal-height) - 16px)
--xy-menu-item-min-height菜单项最小高度44px
--xy-menu-item-padding-inline菜单项横向内边距14px
--xy-menu-item-radius菜单项圆角14px
--xy-menu-hover-bghover 背景色var(--xy-bg-subtle)
--xy-menu-hover-shadowhover 阴影/描边inset 0 0 0 1px color-mix(...)
--xy-menu-active-bg激活态背景色var(--xy-brand-soft)
--xy-menu-active-color激活态文字色var(--xy-brand)
--xy-menu-popup-min-width弹出菜单最小宽度216px
--xy-menu-popup-padding弹出菜单内边距10px
--xy-menu-popup-radius弹出菜单圆角var(--xy-radius-lg)
--xy-menu-group-title-padding分组标题内边距6px 14px 8px
--xy-menu-sub-list-padding纵向子菜单列表内边距8px 0 8px 14px
--xy-menu-badge-bgitems 模式徽标背景色var(--xy-brand-soft)
--xy-menu-extra-coloritems 模式附加信息文字色var(--xy-text-muted)
属性说明类型默认值
mode菜单展示模式MenuMode'vertical'
default-active初始激活项 indexstring''
default-openeds初始展开的子菜单索引集合string[][]
active-index受控激活项 indexstringundefined
opened-menus受控展开的子菜单索引集合string[]undefined
unique-opened是否同一层只允许展开一个子菜单booleanfalse
router是否启用路由模式booleanfalse
menu-trigger横向模式下子菜单触发方式MenuTrigger'hover'
collapse是否折叠,仅纵向模式生效booleanfalse
items数据驱动菜单树,和默认插槽二选一MenuDataItem[]undefined
permission-checkeritems 模式下的权限判定函数MenuPermissionCheckerundefined
ellipsis横向模式宽度不足时是否启用收纳booleantrue
popper-offset所有弹出子菜单的偏移量number6
ellipsis-icon横向收纳入口图标string | Component'mdi:dots-horizontal'
popper-effect弹出菜单主题MenuPopperEffect'dark'
popper-class弹出菜单自定义类名string''
popper-style弹出菜单自定义样式StyleValueundefined
show-timeout弹出菜单显示延迟number300
hide-timeout弹出菜单隐藏延迟number300
close-on-click-outside点击外部时是否关闭已展开菜单booleanfalse
collapse-transition是否启用纵向折叠过渡booleantrue
persistent关闭后是否保留弹出菜单 DOMbooleantrue
background-color菜单背景色兼容属性string''
text-color菜单文字色兼容属性string''
active-text-color激活项文字色兼容属性string''
事件说明参数
select菜单项被选中时触发MenuSelectEvent
open子菜单展开时触发MenuOpenEvent
close子菜单收起时触发MenuCloseEvent
update:activeIndex受控模式下激活项变化时触发MenuActiveIndexChangeHandler
update:openedMenus受控模式下展开项集合变化时触发MenuOpenedMenusChangeHandler
插槽说明
default放置 xy-menu-itemxy-sub-menuxy-menu-item-group;若同时传 items,默认插槽优先
暴露项说明类型
open主动展开指定子菜单MenuExposes["open"]
close主动收起指定子菜单MenuExposes["close"]
handleResize手动重新计算横向溢出状态MenuExposes["handleResize"]
updateActiveIndex主动更新当前激活项MenuExposes["updateActiveIndex"]
属性说明类型默认值
index子菜单唯一标识string
disabled是否禁用booleanfalse
teleported弹出菜单是否 Teleport 到 bodybooleanundefined
popper-offset当前子菜单弹出偏移量numberundefined
popper-class当前子菜单弹出类名string''
popper-style当前子菜单弹出样式StyleValueundefined
show-timeout当前子菜单显示延迟numberundefined
hide-timeout当前子菜单隐藏延迟numberundefined
expand-close-icon展开模式关闭图标string | Componentundefined
expand-open-icon展开模式打开图标string | Componentundefined
collapse-close-icon折叠模式关闭图标string | Componentundefined
collapse-open-icon折叠模式打开图标string | Componentundefined
插槽说明
title子菜单标题
default子菜单内容
属性说明类型默认值
index菜单项唯一标识string
route路由模式下的跳转目标RouteLocationRawundefined
disabled是否禁用booleanfalse
事件说明参数
click点击菜单项时触发MenuItemClickHandler
插槽说明
default菜单项内容;可直接承载完整内容,也可与 title 搭配作为前置区
title菜单项正文;在折叠态一级菜单项中会自动作为 Tooltip 内容
属性说明类型默认值
title分组标题string''
插槽说明
title分组标题
default分组内容
字段说明类型
index节点唯一标识string
label节点显示文案string
type节点类型MenuDataItemType
children子节点列表MenuDataItem[]
disabled是否禁用boolean
route路由模式下的跳转目标RouteLocationRaw
icon前置图标string | Component
badge徽标文案string | number
extraText右侧附加信息string
hidden是否直接裁剪节点boolean
permission权限标识,交给 permission-checker 决定是否可见string | string[]