组件 · 导航
DropdownMenu 下拉菜单
组合式下拉菜单。@selrux/ui@0.4.1 起 DropdownMenuTrigger 的 render 可换成任意可挂 ref 的元素或组件(Button、a、Avatar、span 等),等价于常见 asChild 用法;非按钮宿主自动补 role="button" 与 tabIndex,可用 nativeButton 固定首屏语义。
使用建议
- 避免:把 Trigger 写成无障碍缺失的纯装饰节点
- 避免:杜撰 asChild 布尔 prop(本库用 render)
- 限制:公开 API 以 @selrux/ui/dropdown-menu 的 d.ts 与源码为准;任意元素触发依赖 0.4.1+ 的 render / nativeButton
引入
import {
DropdownMenu,
DropdownMenuArrow,
DropdownMenuCheckboxItem,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
// …共 18 个导出
} from '@selrux/ui/dropdown-menu';演练场
调节下方可实现的字面量属性,实时预览真实组件。函数、Portal、样式逃生口等见代码演示与 API 表。
代码演示
基础用法
触发器打开菜单,textValue 用于键盘输入定位。
勾选与单选
CheckboxItem 多选开关,RadioGroup + RadioItem 互斥选择。
受控勾选与单选
CheckboxItem 的 checked / onCheckedChange、RadioGroup 的 value / onValueChange 受控;closeOnAction 决定选择后是否关闭;onAction 统一接收激活。
位置与尺寸
DropdownMenuContent 的 side / align / sideOffset / collisionPadding;根的 size;loop={false} 关闭首尾循环。
受控打开与关闭策略
open / onOpenChange 受控;closeOnEscape、closeOnOutsidePress 控制关闭方式;disabled 禁止打开;defaultOpen 为非受控初始值。
自定义触发器
render 可换成任意元素——Button、链接、Avatar、图标、纯文字或表格行内操作。非按钮元素自动补 role="button" 与 tabIndex,Enter / Space / ↓ 打开,关闭后焦点回到触发器;disabled 改用 aria-disabled。
| 项目 | 负责人 | 操作 |
|---|---|---|
| Alpha | 运营 | |
| Beta | 运营 |
API
属性覆盖:示例用到 46 / 47 个自有属性(97.9%)
由 scripts/demo-coverage.mjs 统计,不含 className / style / 原生透传属性与纯转发事件。
DropdownMenu.returnFocusRef:焦点目标 ref,效果不可见;行为见“无障碍”DropdownMenuPortal.container:Portal 挂载目标,默认 body;文档页无需更换挂载点
DropdownMenu
DropdownMenu 根。无布局 DOM。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
size | 菜单字号与项内距;省略取 Provider → md。 | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | - |
disabled | 为真时禁止打开并立即抑制可见层。 | boolean | - |
loop | 当前菜单面上下导航是否循环。默认 true。 | boolean | true |
closeOnEscape | 顶层 Esc 是否进入关闭流程。默认 true。 | boolean | true |
closeOnOutsidePress | 外部主指针是否关闭整棵菜单树。默认 true。 | boolean | true |
returnFocusRef | 整棵关闭后适用的返回焦点目标。 | RefObject<HTMLElement | null> | - |
open | 受控打开;与 defaultOpen 互斥。 | boolean | - |
defaultOpen | 非受控默认打开;挂载时读取一次。 | boolean | - |
onOpenChange | 请求变更;不强改父状态。 | ((open: boolean, details: OverlayChangeDetails) => void) | - |
children | 复合子树。 | ReactNode | - |
DropdownMenuArrow
DropdownMenuArrow。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
children | 装饰内容。 | ReactNode | - |
另有 278 项原生属性与事件继承自 HTMLAttributes,原样透传。
DropdownMenuCheckboxItem
DropdownMenuCheckboxItem。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
textValue * | typeahead 文本。 | string | - |
defaultChecked | 非受控默认选中。 | boolean | - |
disabled | 禁用。 | boolean | - |
inset | 起步缩进。 | boolean | - |
onAction | 可选;在 checked 变更后通知。 | ((details: MenuActionDetails) => void) | - |
closeOnAction | 默认 false,保持菜单打开。 | boolean | false |
checked | 受控选中。 | boolean | - |
onCheckedChange | 选中变更。 | ((checked: boolean, details: MenuActionDetails) => void) | - |
children | 可见内容。 | ReactNode | - |
另有 283 项原生属性与事件继承自 ButtonHTMLAttributes / HTMLAttributes,原样透传。
DropdownMenuContent
DropdownMenuContent。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
style | 普通样式;受管定位不可绕过。 | CSSProperties | - |
side | 物理四向;根默认 bottom,子默认逻辑外向。 | "top" | "bottom" | "left" | "right" | bottom |
align | 对齐;默认 start。 | "start" | "end" | "center" | start |
sideOffset | 侧向间距(CSS px)。 | number | - |
collisionPadding | 碰撞内边距(CSS px)。 | number | - |
onEscapeKeyDown | Esc;preventDefault 取消关闭。 | ((event: KeyboardEvent) => void) | - |
onPointerDownOutside | 外部主指针;preventDefault 取消关闭。 | ((event: Event) => void) | - |
children | 菜单面子树。 | ReactNode | - |
另有 277 项原生属性与事件继承自 HTMLAttributes,原样透传。
DropdownMenuGroup
DropdownMenuGroup。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
children | 组内容。 | ReactNode | - |
另有 278 项原生属性与事件继承自 HTMLAttributes,原样透传。
DropdownMenuItem
DropdownMenuItem。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
textValue * | 可访问名与 typeahead 来源;必填非空。 | string | - |
disabled | 禁用;aria-disabled,集合内仍可达。 | boolean | - |
variant | 危险动作外观。 | "default" | "destructive" | - |
inset | 无前导图标时的起步缩进。 | boolean | - |
onAction | 统一激活入口。 | ((details: MenuActionDetails) => void) | - |
closeOnAction | 激活后是否关闭整棵菜单。默认 true。 | boolean | true |
children | 可见内容。 | ReactNode | - |
另有 285 项原生属性与事件继承自 ButtonHTMLAttributes / HTMLAttributes,原样透传。
DropdownMenuLabel
DropdownMenuLabel。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
children | 标签文本。 | ReactNode | - |
另有 279 项原生属性与事件继承自 HTMLAttributes,原样透传。
DropdownMenuPortal
DropdownMenuPortal。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
container | 挂载目标;省略默认 body;显式 null 等待就绪。 | PortalContainerInput | body |
children | Portal 子树。 | ReactNode | - |
DropdownMenuRadioGroup
DropdownMenuRadioGroup。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
defaultValue | 非受控默认值。 | string | - |
value | 受控值。 | string | - |
onValueChange | 值变更。 | ((value: string, details: MenuActionDetails) => void) | - |
children | 组内项。 | ReactNode | - |
另有 277 项原生属性与事件继承自 HTMLAttributes,原样透传。
DropdownMenuRadioItem
DropdownMenuRadioItem。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
value * | 组内唯一值。 | string | - |
textValue * | typeahead 文本。 | string | - |
disabled | 禁用。 | boolean | - |
inset | 起步缩进。 | boolean | - |
onAction | 可选激活通知。 | ((details: MenuActionDetails) => void) | - |
closeOnAction | 默认 false。 | boolean | false |
children | 可见内容。 | ReactNode | - |
另有 283 项原生属性与事件继承自 ButtonHTMLAttributes / HTMLAttributes,原样透传。
DropdownMenuSeparator
DropdownMenuSeparator。
无自有属性;其余 278 项原生属性继承自 HTMLAttributes。
DropdownMenuShortcut
DropdownMenuShortcut。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
children | 提示文本。 | ReactNode | - |
另有 279 项原生属性与事件继承自 HTMLAttributes,原样透传。
DropdownMenuSub
DropdownMenuSub。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
open | 受控打开。 | boolean | - |
defaultOpen | 非受控默认。 | boolean | - |
onOpenChange | 子菜单开关变更。 | ((open: boolean, details: OverlayChangeDetails) => void) | - |
children | 子树。 | ReactNode | - |
DropdownMenuSubContent
DropdownMenuSubContent。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
style | 普通样式;受管定位不可绕过。 | CSSProperties | - |
side | 物理四向;根默认 bottom,子默认逻辑外向。 | "top" | "bottom" | "left" | "right" | bottom |
align | 对齐;默认 start。 | "start" | "end" | "center" | start |
sideOffset | 侧向间距(CSS px)。 | number | - |
collisionPadding | 碰撞内边距(CSS px)。 | number | - |
onEscapeKeyDown | Esc;preventDefault 取消关闭。 | ((event: KeyboardEvent) => void) | - |
onPointerDownOutside | 外部主指针;preventDefault 取消关闭。 | ((event: Event) => void) | - |
children | 菜单面子树。 | ReactNode | - |
另有 277 项原生属性与事件继承自 HTMLAttributes,原样透传。
DropdownMenuSubTrigger
DropdownMenuSubTrigger。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
textValue * | typeahead 文本。 | string | - |
disabled | 禁用。 | boolean | - |
inset | 起步缩进。 | boolean | - |
children | 可见内容。 | ReactNode | - |
另有 283 项原生属性与事件继承自 ButtonHTMLAttributes / HTMLAttributes,原样透传。
DropdownMenuTrigger
DropdownMenuTrigger。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
render | 与 children 互斥。 | ReactElement<unknown, string | JSXElementConstructor<any>> | - |
nativeButton | render 落到的宿主是否为原生 <button>。省略时自动判断:内置元素看标签,组件挂载后看实际 DOM。
渲染为链接、头像、图标、span 等非按钮宿主时,自动补 role="button"、tabIndex,禁用改为
aria-disabled 并移出 Tab 序列;SSR 首屏需要准确语义时可显式传 false。 | boolean | - |
children | 按钮内容。 | ReactNode | - |
另有 284 项原生属性与事件继承自 ButtonHTMLAttributes / HTMLAttributes,原样透传。
导出类型:DropdownMenuArrowProps、DropdownMenuCheckboxItemProps、DropdownMenuContentProps、DropdownMenuGroupProps、DropdownMenuItemProps、DropdownMenuItemVariant、DropdownMenuLabelProps、DropdownMenuPortalProps、DropdownMenuProps、DropdownMenuRadioGroupProps、DropdownMenuRadioItemProps、DropdownMenuSeparatorProps、DropdownMenuShortcutProps、DropdownMenuSize、DropdownMenuSubContentProps、DropdownMenuSubProps、DropdownMenuSubTriggerProps、DropdownMenuTriggerHostOptions、DropdownMenuTriggerProps、MenuActionDetails、OverlayAlign、OverlayChangeDetails、OverlayChangeReason、OverlaySide、PortalContainerInput
函数与常量
| 名称 | 说明 | 签名 / 类型 |
|---|---|---|
dropdownMenuSizes | 合法尺寸集合。 | Set<DropdownMenuSize> |
resolveDropdownMenuSize | 按显式值、最近 Provider、md 的顺序解析尺寸。 | (size: DropdownMenuSize | undefined, configured: DropdownMenuSize | undefined) => DropdownMenuSize |
无障碍
摘自源码 JSDoc。
DropdownMenu.closeOnEscape:顶层 Esc 是否进入关闭流程。DropdownMenu.returnFocusRef:整棵关闭后适用的返回焦点目标。DropdownMenuContent.onEscapeKeyDown:Esc;preventDefault 取消关闭。DropdownMenuItem.disabled:禁用;aria-disabled,集合内仍可达。DropdownMenuSubContent.onEscapeKeyDown:Esc;preventDefault 取消关闭。- 渲染为链接、头像、图标、
span等非按钮宿主时,自动补role="button"、tabIndex,禁用改为 aria-disabled并移出 Tab 序列;SSR 首屏需要准确语义时可显式传false。