Dropdown

显示用户可选择的操作或选项列表。


安装

The above command is for individual installation only. You may skip this step if @heroui/react is already installed globally.

导入

HeroUI 导出 5 个下拉菜单相关组件:

  • Dropdown: 主要组件,是其他组件的包装器。该组件是 Popover 组件的扩展,因此它接受 Popover 组件的所有属性。
  • DropdownTrigger: 触发下拉菜单打开的组件。
  • DropdownMenu: 包含下拉菜单项的组件。
  • DropdownSection: 包含一组下拉菜单项的组件。
  • DropdownItem: 表示下拉菜单项的组件。

用法

动态项

Dropdown 遵循 集合组件 API,接受静态和动态集合。

  • 静态: 上面的使用示例展示了静态实现,可在提前知道完整选项列表时使用。
  • 动态: 下面的示例可在选项来自外部数据源(如 API 调用)或随时间更新时使用。

禁用键

可以使用 DropdownMenu 组件的 disabledKeys 属性禁用下拉菜单项。

注意: 确保每个项都有唯一的键,否则禁用键将无法正常工作。

操作事件

可以使用 onAction 属性获取所选项的键。

变体

可以使用 DropdownMenu 组件中的 variant 属性更改下拉菜单项的 hover 样式。

单选

可以将 selectionMode 属性设置为 single 以允许用户一次仅选择一个项。

多选

可以将 selectionMode 属性设置为 multiple 以允许用户一次选择多个项。

注意: 若要允许空选,可将 disallowEmptySelection 属性设置为 false

带快捷键

可以使用 shortcut 属性为下拉菜单项添加快捷键。

注意: Dropdown 不处理快捷键事件,您需要自行处理。

带图标

可以使用 startContent / endContent 属性为下拉菜单项添加图标。

注意: 如果使用 currentColor 作为图标颜色,图标将具有与项文本相同的颜色。

带描述

可以使用 description 属性为下拉菜单项添加描述。

带分组

可以使用 DropdownSection 组件对下拉菜单项进行分组。

注意: 没有 title 的分组必须提供 aria-label 以实现无障碍访问。

自定义触发器

可以将任何组件用作下拉菜单的触发器,只需将其包装在 DropdownTrigger 组件中即可。

更改背景层

如前所述,Dropdown 组件是 Popover 组件的扩展, 因此它接受 Popover 组件的所有属性,包括 backdrop 属性。

路由

<DropdownItem> 组件可与 Next.jsReact Router 等框架和客户端路由器配合使用。请参阅 路由 指南了解如何设置。

插槽

Dropdown 包含 3 个具有插槽的组件:DropdownMenuDropdownItemDropdownSection 组件。

  • base: 菜单组件的主包装器。此插槽包装 topContentbottomContentlist 插槽。
  • list: 菜单列表组件的插槽。您可以将此插槽视为 ul 插槽。
  • emptyContent: 当集合为空时显示的插槽内容。
  • base: 下拉菜单项的主插槽。它包装所有其他插槽。
  • wrapper: titledescription 的包装器。
  • title: 下拉菜单项的标题。
  • description: 下拉菜单项的描述。
  • shortcut: 快捷键插槽。
  • selectedIcon: 选中图标插槽。仅在项被选中时可见。
  • base: 下拉菜单分组的主插槽。它包装所有其他插槽。
  • heading: 在分组顶部渲染的标题。
  • group: 下拉菜单项的分组。
  • divider: 在分组之间渲染的分隔线。仅在 showDividertrue 时可见。

自定义下拉菜单弹出框

Dropdown 组件是 Popover 组件的扩展,因此您可以使用相同的 插槽来自定义下拉菜单。

自定义下拉菜单项样式

您可以通过使用 DropdownMenuitemClasses 属性或使用 DropdownItem 插槽来自定义下拉菜单项,itemClasses 允许您一次性自定义所有项,而插槽允许 您单独自定义每个项。

键盘交互

按键描述
Space当焦点在 DropdownTrigger 上时,打开下拉菜单并将焦点置于第一个项上。当焦点在项上时,激活焦点所在项。
Enter当焦点在 DropdownTrigger 上时,打开下拉菜单并将焦点置于第一个项上。当焦点在项上时,激活焦点所在项。
ArrowDown当焦点在 DropdownTrigger 上时,打开下拉菜单。当焦点在项上时,将焦点移动到下一个项。
ArrowUp当焦点在项上时,将焦点移动到上一个项。
Esc关闭下拉菜单并将焦点移动到 DropdownTrigger
A-Za-z当菜单打开时,如果存在以键入字符开头的标签,则将焦点移动到具有该标签的下一个菜单项。

数据属性

DropdownItembase 元素上具有以下属性:

  • data-disabled: 当下拉菜单项被禁用时。基于 dropdown disabledKeys 属性。
  • data-selected: 当下拉菜单项被选中时。基于 dropdown selectedKeys 属性。
  • data-hover: 当下拉菜单项被悬停时。基于 useHover
  • data-pressed: 当下拉菜单项被按下时。基于 usePress
  • data-focus: 当下拉菜单项获得焦点时。基于 useFocusRing
  • data-focus-visible: 当通过键盘使下拉菜单项获得焦点时。基于 useFocusRing

无障碍访问

  • 使用 ARIA 作为具有 menubutton 暴露给辅助技术。
  • 支持单选、多选或无选择。
  • 支持禁用项。
  • 支持分组。
  • 支持复杂的项标签以实现无障碍访问。
  • 支持键盘导航,包括箭头键、Home/End、Page Up/Down。有关详细信息,请参阅 键盘交互
  • 支持键盘导航期间的自动滚动。
  • 支持使用箭头键打开菜单,包括自动相应地将焦点置于第一个或最后一个项。
  • 支持通过键入文本来聚焦项的输入预测。
  • 支持虚拟化滚动以提高长列表的性能。

API

PropTypeDefault
children*
ReactNode[]
type
menu | listbox
"menu"
trigger
press | longPress
"press"
isDisabled
boolean
false
closeOnSelect
boolean
true
shouldBlockScroll
boolean
true
PopoverProps
PopoverProps
PropTypeDefault
onOpenChange
(isOpen: boolean) => void
shouldCloseOnInteractOutside
(e: HTMLElement) => void
onClose
() => void
PropTypeDefault
children
ReactNode
PropTypeDefault
children*
ReactNode | ((item: T) => ReactElement)
items
Iterable<T>
variant
solid | bordered | light | flat | faded | shadow
"solid"
color
default | primary | secondary | success | warning | danger
"default"
selectionMode
none | single | multiple
selectedKeys
all | Iterable<React.Key>
disabledKeys
Iterable<React.Key>
defaultSelectedKeys
all | Iterable<React.Key>
disallowEmptySelection
boolean
false
autoFocus
boolean | first | last
false
topContent
ReactNode
bottomContent
Node
emptyContent
ReactNode
"No items."
hideEmptyContent
boolean
false
hideSelectedIcon
boolean
false
shouldFocusWrap
boolean
false
closeOnSelect
boolean
true
disableAnimation
boolean
false
classNames
Partial<Record<'base'|'list'|'emptyContent', string>>
itemClasses
Partial<Record<'base'|'wrapper'|'title'|'description'|'shortcut'|'selectedIcon', string>>
PropTypeDefault
onAction
(key: React.Key) => void
onSelectionChange
(keys: "all" | Set<React.Key> & {anchorKey?: string; currentKey?: string}) => void
onClose
() => void
PropTypeDefault
children*
ReactNode
title
string
items
Iterable<T>
hideSelectedIcon
boolean
false
showDivider
boolean
false
dividerProps
DividerProps
classNames
Record<'base'|'heading'|'group'|'divider', string>>
itemClasses
Record<'base'|'wrapper'|'title'|'description'|'shortcut'|'selectedIcon', string>>
PropTypeDefault
children*
ReactNode
key
React.Key
title
string | ReactNode
textValue
string
description
string | ReactNode
shortcut
string | ReactNode
startContent
ReactNode
endContent
ReactNode
selectedIcon
SelectedIconProps
showDivider
boolean
false
href
string
target
HTMLAttributeAnchorTarget
rel
string
download
boolean | string
ping
string
referrerPolicy
HTMLAttributeReferrerPolicy
isDisabled
boolean
false
isSelected
boolean
false
isReadOnly
boolean
false
hideSelectedIcon
boolean
false
closeOnSelect
boolean
true
classNames
Record<'base'|'wrapper'|'title'|'description'|'shortcut'|'selectedIcon', string>>
PropTypeDefault
onAction
() => void
onClose
() => void
onPress
(e: PressEvent) => void
onPressStart
(e: PressEvent) => void
onPressEnd
(e: PressEvent) => void
onPressChange
(isPressed: boolean) => void
onPress
(e: PressEvent) => void
onKeyDown
(e: KeyboardEvent) => void
onKeyUp
(e: KeyboardEvent) => void
onClick
MouseEventHandler

类型