Skip to content

Dropdown 下拉菜单

xy-dropdown 负责“操作菜单”,不是“值选择器”。采用复合组件结构,主路径推荐 Dropdown + DropdownMenu + DropdownItem;如果项目里已经在使用旧的 items 数组模式,也仍然兼容。

基础用法

行操作菜单是 Dropdown 最典型的使用场景,适合把弱操作、危险操作和说明文案收进一个菜单里。

基础用法操作菜单

下拉菜单用于收纳操作选项,支持禁用、分隔线和危险操作。

动态位置与箭头

在工具栏、表格行操作和卡片角标里,菜单位置往往需要根据页面结构切换,show-arrow 适合让浮层关系更清楚。

当前 placement:bottom-start最近操作:暂无

选择后保持展开

hide-on-click 适合连续操作、辅助说明或“看完再选”的菜单场景。

触发方式与命令派发

trigger 支持数组写法,trigger-keys 可以按业务场景收敛成更明确的键盘入口。

等待触发

Split Button

当一个主按钮还需要承接更多延伸操作时,可以切到 split-button 形态。

等待操作

实例级样式收口

当后台项目只想统一操作菜单的面板气质时,优先通过 popper-class 和实例级变量收口,而不是继续 deep 到内部类名。

等待触发命令

items 兼容模式

旧的 items 数组模式仍可用,适合渐进迁移;但新功能优先推荐复合组件写法。

兼容模式:等待触发
  • Tooltip:纯文案提示,不承载交互,不产出值。
  • Popover:轻量说明或轻交互卡片,可以承载按钮和简单表单。
  • Popconfirm:原地确认动作,自带 confirm/cancel 流程和异步 hook。
  • Dropdown:操作菜单,产出命令(command)而非值(value);如果你需要筛选枚举,优先用 xy-select / xy-tree-select / xy-cascader

推荐入口与兼容入口

  • 主路径(推荐):复合组件 Dropdown + DropdownMenu + DropdownItem,适合需要 icon、divided、description、自定义插槽的菜单。
  • 兼容路径items 数组模式,适合简单菜单或渐进迁移旧页面;新功能不再以此为主入口。
  • 两条路径共用 command 派发机制,区别在于复合组件可以逐项定制插槽和样式,items 只支持扁平配置。

hide-on-clickclose-on-select 的优先级

  • hide-on-click:控制"选择菜单项后是否关闭面板",是当前推荐的主属性。
  • close-on-select:语义相同,是兼容别名。
  • 优先级规则:如果同时传入 hide-on-clickclose-on-select,以 hide-on-click 为准。只传 close-on-select 时仍然生效,但新代码建议只写 hide-on-click
  • 默认行为:两个都不传时,选择后会自动关闭面板。

命名映射

Vue 模板中 props 和 events 使用 kebab-case,源码 / TS 类型层使用 camelCase,两者由 Vue 自动转换,等价:

Props 映射

模板写法(kebab-case)源码 / TS 写法(camelCase)
model-valuemodelValue
hide-on-clickhideOnClick
close-on-selectcloseOnSelect
split-buttonsplitButton
button-propsbuttonProps
trigger-keystriggerKeys
open-delayopenDelay
close-delaycloseDelay
show-aftershowAfter
hide-afterhideAfter
max-heightmaxHeight
show-arrowshowArrow
append-toappendTo
popper-classpopperClass
popper-stylepopperStyle
virtual-refvirtualRef
virtual-triggeringvirtualTriggering
popper-optionspopperOptions

其余属性(itemsplacementdisabledtriggerroleteleportedpersistenttabindexloop)为单词形式,模板与源码写法一致,无需转换。

Events 映射

模板写法(kebab-case)源码 emit 写法(camelCase)
update:model-valueupdate:modelValue
visible-changevisibleChange

其余事件(selectcommandclick)为单单词,模板与源码写法一致。

下方 API 表格统一按模板层推荐写法列出。

实例级样式收口

  • 后台项目如果只是想收口操作菜单的背景、边框、阴影、宽度或层级,优先使用 popper-classpopper-stylemax-height
  • 不建议继续在页面层 deep 到 .xy-dropdown__menu.xy-dropdown__item.xy-dropdown__group 这类内部结构类名。

role 与键盘路径

Dropdown 当前支持 roving tabindex 管理焦点,默认以 menu 语义渲染;如果是站点导航或快捷入口,也可以切到 navigation 语义。

键盘与行为约定

  • ArrowUp / ArrowDown / Home / End 在菜单项之间移动。
  • Enter / Space 选择当前高亮项;也可以通过 trigger-keys 定义触发区的打开键。
  • Escape 关闭菜单并把焦点还给触发器。
  • Tab 会关闭菜单;当前高亮项通过 roving tabindex 管理。

使用提示

  • 推荐优先使用 DropdownMenu / DropdownItem 组合式 API,复杂内容和 item 级 icon/divided 都走这条路径。
  • 旧的 close-on-select 仍然保留为兼容别名;如果同时传了 hide-on-click,以后者为准。
  • to / replace 不属于 DropdownItem 的职责,这一层只负责命令和动作,不负责路由跳转。
  • virtual-ref / virtual-triggeringpopper-options 适合右键菜单、虚拟触发器和更细粒度的浮层控制。

API

属性说明类型默认值
model-value受控显示状态DropdownProps["modelValue"]false
items兼容模式下的菜单项列表DropdownItem[][]
placement菜单位置Placement'bottom-start'
disabled是否禁用booleanfalse
hide-on-click选择后是否关闭booleanundefined
close-on-select兼容别名,若与 hide-on-click 同时存在以后者为准booleantrue
role菜单语义DropdownRole'menu'
trigger触发方式,支持单值或数组DropdownTrigger | DropdownTrigger[]'hover'
trigger-keys触发区键盘打开键string[]['Enter','NumpadEnter',' ','ArrowDown']
open-delayhover 打开延迟number80
close-delayhover 关闭延迟number120
show-after打开延迟别名,优先级高于 open-delaynumberundefined
hide-after关闭延迟别名,优先级高于 close-delaynumberundefined
max-height菜单最大高度string | number''
teleported是否通过 Teleport 挂载到外层容器booleantrue
append-toTeleport 的挂载目标string | HTMLElement'body'
persistent关闭后是否保留 DOMbooleanfalse
popper-class菜单容器自定义类名string''
popper-style菜单容器自定义样式StyleValueundefined
show-arrow是否显示浮层箭头booleantrue
virtual-ref虚拟触发引用或虚拟定位引用ReferenceElement | nullnull
virtual-triggering是否启用虚拟触发模式booleanfalse
split-button是否切换为分裂按钮booleanfalse
button-propssplit-button 下透传给按钮的配置Partial<ButtonProps>undefined
tabindex触发区 tab 索引string | number0
looproving tabindex 是否循环booleantrue
popper-options定位兼容配置子集DropdownPopperOptions{}
事件说明参数
update:model-value开关状态变化DropdownModelValueChangeHandler
select选择菜单项DropdownSelectHandler
command触发命令派发DropdownCommandHandler
visible-change菜单开关状态变化DropdownVisibleChangeHandler
clicksplit-button 主按钮点击DropdownClickHandler
插槽说明
default触发区域,或 split-button 下主按钮内容
dropdown菜单内容,主路径推荐承接 xy-dropdown-menu
插槽说明
default菜单项列表,通常传入 xy-dropdown-item
属性说明类型默认值
command命令值DropdownCommandundefined
disabled是否禁用booleanfalse
divided是否在项前显示分割线booleanfalse
icon前置图标string''
danger是否危险操作样式booleanfalse
description次级描述string''
text-value文本值兜底,便于命令派发或未来扩展string''
插槽说明
default主内容
icon自定义前置图标;存在时会覆盖 icon prop 的渲染结果
description自定义次级描述区;存在时会覆盖 description prop 的渲染结果
字段说明类型默认值
key菜单项标识string
label展示文案string
disabled是否禁用booleanfalse
danger是否危险操作样式booleanfalse
description辅助描述stringundefined
command额外派发值DropdownCommandkey
divided是否分割线booleanfalse
icon前置图标stringundefined
textValue文本值兜底stringundefined