下拉菜单
显示用户可以选择的操作或选项列表。
安装
npx nextui-cli@latest add dropdown
以上命令仅用于单个安装。如果 @nextui-org/react
已经全局安装,可以跳过此步骤。
导入
NextUI 导出 5 个与下拉菜单相关的组件
- Dropdown: 主要组件,是其他组件的包装器。此组件是 Popover 组件的扩展,因此它接受 Popover 组件的所有 props。
- DropdownTrigger: 触发下拉菜单打开的组件。
- 下拉菜单: 包含下拉项的组件。
- 下拉部分: 包含一组下拉项的组件。
- 下拉项: 代表下拉项的组件。
用法
动态项
下拉菜单遵循 集合组件 API,接受静态和动态集合。
- 静态: 上面的用法示例展示了静态实现,当所有选项列表提前已知时可以使用。
- 动态:以下示例适用于选项来自外部数据源(例如 API 调用)或随时间更新的情况。
禁用键
可以使用 disabledKeys
属性在 DropdownMenu
组件中禁用下拉菜单项。
注意:为每个项目设置一个唯一的键非常重要,否则禁用键将不起作用。
操作事件
可以使用 onAction
属性获取所选项目的键。
变体
可以使用 variant
在 DropdownMenu
组件中更改下拉菜单项的 hover
样式。
单选
您可以将 selectionMode
属性设置为 single
,以允许用户一次只选择一项。
多选
您可以将 selectionMode
属性设置为 multiple
,以允许用户一次选择多项。
注意:要允许空选择,您可以将
disallowEmptySelection
属性设置为false
。
带快捷键
您可以使用 shortcut
属性为下拉菜单项添加快捷键。
注意:下拉菜单不处理快捷键事件,您需要自己处理。
带图标
可以使用 startContent
/ endContent
属性向下拉菜单项添加图标。
注意: 如果使用
currentColor
作为图标颜色,图标将与项目文本具有相同的颜色。
带描述
可以使用 description
属性向下拉菜单项添加描述。
带分段
可以使用 DropdownSection
组件对下拉菜单项进行分组。
注意: 没有
title
的分段必须提供aria-label
以确保可访问性。
自定义触发器
您可以使用任何组件作为下拉菜单的触发器,只需将其包裹在 DropdownTrigger
组件中即可。
更改背景
正如我们之前提到的,Dropdown
组件是 Popover 组件的扩展,因此它接受 Popover 组件的所有 props,包括 backdrop
prop。
路由
<DropdownItem>
组件与框架和客户端路由器(如 Next.js 和 React Router)一起工作。请参阅 路由 指南,了解如何设置它。
import {Dropdown, DropdownMenu, DropdownTrigger, DropdownItem, Button} from "@nextui-org/react";function App() {return (<Dropdown><DropdownTrigger><Button variant="bordered">Open Menu</Button></DropdownTrigger><DropdownMenu aria-label="Link Actions"><DropdownItem key="home" href="/home">Home</DropdownItem><DropdownItem key="about" href="/about">About</DropdownItem></DropdownMenu></Dropdown>);}
插槽
下拉菜单有 3 个组件,它们分别带有插槽:DropdownMenu
、DropdownItem
和 DropdownSection
组件。
DropdownMenu
- base: 菜单组件的主要包装器。此插槽包装了
topContent
、bottomContent
和list
插槽。 - list: 菜单列表组件的插槽。您可以将此插槽视为
ul
插槽。 - emptyContent: 集合为空时显示的插槽内容。
DropdownItem
- base: 下拉菜单项的主要插槽。它包装了所有其他插槽。
- wrapper:
title
和description
的包装器。 - title: 下拉菜单项的标题。
- description: 下拉菜单项的描述。
- shortcut: 快捷键插槽。
- selectedIcon: 选定图标插槽。仅当项目被选中时可见。
DropdownSection
- base: 下拉菜单部分的主要插槽。它包装了所有其他插槽。
- heading: 在部分组顶部渲染的标题。
- group: 下拉菜单项的组。
- divider: 在组之间渲染的分隔符。仅当
showDivider
为true
时可见。
自定义下拉弹出窗口
Dropdown
组件是 Popover 组件的扩展,因此您可以使用相同的插槽来自定义下拉菜单。
自定义下拉菜单项样式
您可以通过使用 DropdownMenu
itemClasses
属性或使用 DropdownItem
插槽来自定义下拉菜单项,itemClasses
允许您一次性自定义所有项目,而插槽允许您单独自定义每个项目。
键盘交互
键 | 描述 |
---|---|
空格 | 当焦点在 DropdownTrigger 上时,打开下拉菜单并使第一个项目获得焦点。当焦点在某个项目上时,激活该项目。 |
回车 | 当焦点在 DropdownTrigger 上时,打开下拉菜单并使第一个项目获得焦点。当焦点在某个项目上时,激活该项目。 |
向下箭头 | 当焦点在 DropdownTrigger 上时,打开下拉菜单。当焦点在某个项目上时,将焦点移动到下一个项目。 |
向上箭头 | 当焦点在某个项目上时,将焦点移动到上一个项目。 |
Esc | 关闭下拉菜单并将焦点移动到 DropdownTrigger 上。 |
A-Z 或 a-z | 当菜单打开时,将焦点移动到下一个标签以输入的字符开头的菜单项(如果存在这样的菜单项)。 |
数据属性
DropdownItem
在 base
元素上具有以下属性
- data-disabled: 当下拉菜单项被禁用时。基于下拉菜单
disabledKeys
属性。 - data-selected: 当下拉菜单项被选中时。基于下拉菜单
selectedKeys
属性。 - data-hover: 当下拉菜单项被悬停时。基于 useHover
- data-pressed: 当下拉菜单项被按下时。基于 usePress
- data-focus: 当下拉菜单项被聚焦时。基于 useFocusRing.
- data-focus-visible: 当下拉菜单项使用键盘获得焦点时。基于 useFocusRing.
无障碍性
- 作为
按钮
,使用 ARIA 暴露给辅助技术,并带有菜单
。 - 支持单选、多选或不选择。
- 支持禁用项目。
- 支持部分。
- 支持复杂项目标签以实现无障碍性。
- 支持键盘导航,包括箭头键、Home/End、Page Up/Down。有关更多详细信息,请参阅 键盘交互。
- 在键盘导航期间支持自动滚动。
- 支持使用箭头键打开菜单,包括自动聚焦第一个或最后一个项目。
- 支持通过输入文本来聚焦项目的联想输入。
- 支持虚拟化滚动,以提高长列表的性能。
API
下拉菜单属性
属性 | 类型 | 描述 | 默认值 |
---|---|---|---|
children* | ReactNode[] | 要渲染的子节点。通常是 DropdownTrigger 和 DropdownMenu 元素。 | - |
类型 | menu | listbox | 下拉触发器打开的叠加层类型。 | menu |
触发器 | press | longPress | 下拉菜单的触发方式。 | press |
isDisabled | boolean | 下拉触发器是否禁用。 | false |
closeOnSelect | boolean | 选择项目后是否应关闭下拉菜单。 | true |
shouldBlockScroll | boolean | 下拉菜单是否应阻止菜单外部滚动。 | true |
PopoverProps | PopoverProps | 由于下拉菜单是弹出框的扩展,因此它接受弹出框组件的所有道具。 | - |
下拉事件
属性 | 类型 | 描述 |
---|---|---|
onOpenChange | (isOpen: boolean) => void | 下拉菜单打开状态发生变化时调用的处理程序。 |
shouldCloseOnInteractOutside | (e: HTMLElement) => void | 当用户在下拉菜单引用范围之外与参数元素交互时,如果应该调用onClose ,则返回true 。 |
onClose | () => void | 当下拉菜单应该关闭时调用的处理程序。 |
DropdownTrigger 属性
属性 | 类型 | 描述 | 默认值 |
---|---|---|---|
children | ReactNode | 下拉菜单触发器组件,确保传递的children 可聚焦。用户可以使用键盘上的 Tab 键切换到它,它可以接受一个引用。这对可访问性至关重要。 | - |
DropdownMenu 属性
属性 | 类型 | 描述 | |
---|---|---|---|
children* | ReactNode | ((item: T) => ReactElement) | 集合的内容。它通常是DropdownItem 或 DropdownSection 。(静态) | - |
项目 | Iterable<T> | 集合中的项目对象。 (动态) | - |
变体 | solid | bordered | light | flat | faded | shadow | 下拉菜单项的外观样式。 | 实心 |
颜色 | default | primary | secondary | success | warning | danger | 下拉菜单项的颜色主题。 | 默认 |
选择模式 | none | single | multiple | 集合中允许的选择类型。 | - |
选定键 | React.Key[] | 集合中当前选定的键(受控)。 | - |
禁用键 | React.Key[] | 禁用的项目键。这些项目不能被选中、聚焦或以其他方式交互。 | - |
默认选定键 | all | React.Key[] | 集合中最初选定的键(不受控制)。 | - |
disallowEmptySelection | boolean | 集合是否允许空选择。 | false |
autoFocus | boolean | first | last | 焦点应该设置在哪里。 | false |
topContent | ReactNode | 在列表框项目上方显示的内容。 | - |
bottomContent | ReactNode | 在列表框项目下方显示的内容。 | - |
emptyContent | ReactNode | 集合为空时显示的内容。 | 没有项目。 |
hideEmptyContent | boolean | 集合为空时是否不显示空内容。 | false |
hideSelectedIcon | boolean | 项目被选中时是否隐藏选中图标。 | false |
shouldFocusWrap | boolean | 键盘导航是否循环。 | false |
closeOnSelect | boolean | 选择项目后是否应关闭下拉菜单。 | true |
disableAnimation | boolean | 是否禁用下拉菜单项的动画。 | false |
classNames | Record<"base"| "list"| "emptyContent", string> | 允许为下拉菜单插槽设置自定义类名。 | - |
itemClasses | Record<"base"| "wrapper"| "title"| "description"| "shortcut" | "selectedIcon", string> | 允许为下拉菜单项插槽设置自定义类名。 | - |
下拉菜单事件
属性 | 类型 | 描述 |
---|---|---|
onAction | (key: React.Key) => void | 选中项目时调用的处理程序。 |
onSelectionChange | (keys: React.Key[]) => void | 选择发生变化时调用的处理程序。 |
onClose | () => void | 选中项目后菜单应该关闭时调用的处理程序。 |
下拉菜单部分 Props
属性 | 类型 | 描述 | 默认值 |
---|---|---|---|
children* | ReactNode | 下拉菜单部分的内容。通常是 DropdownItem 组件的列表。(静态) | - |
标题 | 字符串 | 下拉菜单部分的标题。 | - |
项目 | Iterable<T> | 集合中的项目对象。 (动态) | - |
hideSelectedIcon | boolean | 项目被选中时是否隐藏选中图标。 | false |
显示分隔线 | boolean | 是否显示组之间的分隔线。 | false |
分隔线 Props | DividerProps | 分隔线组件的 Props。 | - |
classNames | Record<"base"| "heading"| "group"| "divider", string> | 允许为下拉菜单部分的插槽设置自定义类名。 | - |
itemClasses | Record<"base"| "wrapper"| "title"| "description"| "shortcut" | "selectedIcon", string> | 允许为下拉菜单项插槽设置自定义类名。 | - |
下拉菜单项 Props
属性 | 类型 | 描述 | 默认值 |
---|---|---|---|
children* | ReactNode | 下拉菜单项的内容。 | - |
键 | React.Key | 下拉菜单项的唯一键。 | - |
标题 | 字符串 | ReactNode | 下拉菜单项的标题。 | - |
文本值 | 字符串 | 项内容的字符串表示,用于诸如类型输入之类的功能。 | - |
描述 | 字符串 | ReactNode | 下拉菜单项的描述。 | - |
快捷键 | 字符串 | ReactNode | 下拉菜单项的键盘快捷键。 | - |
开始内容 | ReactNode | 下拉菜单项的开始内容。 | - |
结束内容 | ReactNode | 下拉菜单项的结束内容。它位于快捷键和选中图标之后。 | - |
选中图标 | SelectedIconProps | 当项目被选中时渲染的自定义图标。 | - |
显示分隔线 | boolean | 是否在项目下方显示分隔线。 | false |
href | 字符串 | 要链接到的 URL。参见 MDN。 | - |
目标 | HTMLAttributeAnchorTarget | 链接的目标窗口。参见 MDN. | - |
rel | 字符串 | 链接资源与当前页面之间的关系。参见 MDN. | - |
下载 | 布尔值 | 字符串 | 导致浏览器下载链接的 URL。可以提供一个字符串来建议文件名。请参阅 MDN。 | - |
ping | 字符串 | 当链接被点击时,要 ping 的 URL 的空格分隔列表。请参阅 MDN。 | - |
referrerPolicy | HTMLAttributeReferrerPolicy | 在点击链接时,要发送多少 referrer 信息。请参阅 MDN。 | - |
isDisabled | boolean | 下拉菜单项是否应该被禁用。(已弃用)请将 disabledKeys 传递给 DropdownMenu 代替。 | false |
isSelected | boolean | 下拉菜单项是否应该被选中。(已弃用)请将 selectedKeys 传递给 DropdownMenu 代替。 | false |
isReadOnly | boolean | 下拉菜单项的点击事件是否应该被忽略。 | false |
hideSelectedIcon | boolean | 当项目被选中时,是否隐藏复选框图标。 | false |
closeOnSelect | boolean | 下拉菜单在选择项目后是否应该关闭。 | true |
classNames | Record<"base"| "wrapper"| "title"| "description"| "shortcut" | "selectedIcon", string> | 允许为下拉菜单项插槽设置自定义类名。 | - |
下拉项事件
属性 | 类型 | 描述 |
---|---|---|
onAction | () => void | 当下拉项被选中时调用的处理程序。(已弃用) 传递给 DropdownMenu 代替。 |
onClose | () => void | 当下拉项在选择后应该关闭时调用的处理程序。(已弃用) 传递给 DropdownMenu 代替。 |
onPress | (e: PressEvent) => void | 当按下操作在目标上释放时调用的处理程序。 |
onPressStart | (e: PressEvent) => void | 当按下交互开始时调用的处理程序。 |
onPressEnd | (e: PressEvent) => void | 当按下交互结束时调用的处理程序,无论是在目标上还是指针离开目标时。 |
onPressChange | (isPressed: boolean) => void | 当按下状态改变时调用的处理程序。 |
onPressUp | (e: PressEvent) => void | 当按下操作在目标上释放时调用的处理程序,无论它是否在目标上开始。 |
onKeyDown | (e: KeyboardEvent) => void | 当按下键时调用的处理程序。 |
onKeyUp | (e: KeyboardEvent) => void | 当释放键时调用的处理程序。 |
onClick | MouseEventHandler | 本机按钮点击事件处理程序 (已弃用) 使用 onPress 代替。 |
类型
下拉菜单项选中图标属性
export type DropdownItemSelectedIconProps = {/*** The current icon, usually an checkmark icon.*/icon?: ReactNode;/*** The current selected status.*/isSelected?: boolean;/*** The current disabled status.* @default false*/isDisabled?: boolean;};type selectedIcon?: ReactNode | ((props: DropdownItemSelectedIconProps) => ReactNode) | null;