下拉菜单

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


安装

npx nextui-cli@latest add dropdown
以上命令仅用于单个安装。如果 @nextui-org/react 已经全局安装,可以跳过此步骤。

导入

NextUI 导出 5 个与下拉菜单相关的组件

  • Dropdown: 主要组件,是其他组件的包装器。此组件是 Popover 组件的扩展,因此它接受 Popover 组件的所有 props。
  • DropdownTrigger: 触发下拉菜单打开的组件。
  • 下拉菜单: 包含下拉项的组件。
  • 下拉部分: 包含一组下拉项的组件。
  • 下拉项: 代表下拉项的组件。

用法

动态项

下拉菜单遵循 集合组件 API,接受静态和动态集合。

  • 静态: 上面的用法示例展示了静态实现,当所有选项列表提前已知时可以使用。
  • 动态:以下示例适用于选项来自外部数据源(例如 API 调用)或随时间更新的情况。

禁用键

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

注意:为每个项目设置一个唯一的键非常重要,否则禁用键将不起作用。

操作事件

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

变体

可以使用 variantDropdownMenu 组件中更改下拉菜单项的 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.jsReact 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 个组件,它们分别带有插槽:DropdownMenuDropdownItemDropdownSection 组件。

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

自定义下拉弹出窗口

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

自定义下拉菜单项样式

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

键盘交互

描述
空格当焦点在 DropdownTrigger 上时,打开下拉菜单并使第一个项目获得焦点。当焦点在某个项目上时,激活该项目。
回车当焦点在 DropdownTrigger 上时,打开下拉菜单并使第一个项目获得焦点。当焦点在某个项目上时,激活该项目。
向下箭头当焦点在 DropdownTrigger 上时,打开下拉菜单。当焦点在某个项目上时,将焦点移动到下一个项目。
向上箭头当焦点在某个项目上时,将焦点移动到上一个项目。
Esc关闭下拉菜单并将焦点移动到 DropdownTrigger 上。
A-Za-z当菜单打开时,将焦点移动到下一个标签以输入的字符开头的菜单项(如果存在这样的菜单项)。

数据属性

DropdownItembase 元素上具有以下属性

  • 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[]要渲染的子节点。通常是 DropdownTriggerDropdownMenu 元素。-
类型menu | listbox下拉触发器打开的叠加层类型。menu
触发器press | longPress下拉菜单的触发方式。press
isDisabledboolean下拉触发器是否禁用。false
closeOnSelectboolean选择项目后是否应关闭下拉菜单。true
shouldBlockScrollboolean下拉菜单是否应阻止菜单外部滚动。true
PopoverPropsPopoverProps由于下拉菜单是弹出框的扩展,因此它接受弹出框组件的所有道具。-
属性类型描述
onOpenChange(isOpen: boolean) => void下拉菜单打开状态发生变化时调用的处理程序。
shouldCloseOnInteractOutside(e: HTMLElement) => void当用户在下拉菜单引用范围之外与参数元素交互时,如果应该调用onClose,则返回true
onClose() => void当下拉菜单应该关闭时调用的处理程序。

属性类型描述默认值
childrenReactNode下拉菜单触发器组件,确保传递的children 可聚焦。用户可以使用键盘上的 Tab 键切换到它,它可以接受一个引用。这对可访问性至关重要。-

属性类型描述
children*ReactNode | ((item: T) => ReactElement)集合的内容。它通常是DropdownItemDropdownSection。(静态)-
项目Iterable<T>集合中的项目对象。 (动态)-
变体solid | bordered | light | flat | faded | shadow下拉菜单项的外观样式。实心
颜色default | primary | secondary | success | warning | danger下拉菜单项的颜色主题。默认
选择模式none | single | multiple集合中允许的选择类型。-
选定键React.Key[]集合中当前选定的键(受控)。-
禁用键React.Key[]禁用的项目键。这些项目不能被选中、聚焦或以其他方式交互。-
默认选定键all | React.Key[]集合中最初选定的键(不受控制)。-
disallowEmptySelectionboolean集合是否允许空选择。false
autoFocusboolean | first | last焦点应该设置在哪里。false
topContentReactNode在列表框项目上方显示的内容。-
bottomContentReactNode在列表框项目下方显示的内容。-
emptyContentReactNode集合为空时显示的内容。没有项目。
hideEmptyContentboolean集合为空时是否不显示空内容。false
hideSelectedIconboolean项目被选中时是否隐藏选中图标。false
shouldFocusWrapboolean键盘导航是否循环。false
closeOnSelectboolean选择项目后是否应关闭下拉菜单。true
disableAnimationboolean是否禁用下拉菜单项的动画。false
classNamesRecord<"base"| "list"| "emptyContent", string>允许为下拉菜单插槽设置自定义类名。-
itemClassesRecord<"base"| "wrapper"| "title"| "description"| "shortcut" | "selectedIcon", string>允许为下拉菜单项插槽设置自定义类名。-
属性类型描述
onAction(key: React.Key) => void选中项目时调用的处理程序。
onSelectionChange(keys: React.Key[]) => void选择发生变化时调用的处理程序。
onClose() => void选中项目后菜单应该关闭时调用的处理程序。

属性类型描述默认值
children*ReactNode下拉菜单部分的内容。通常是 DropdownItem 组件的列表。(静态)-
标题字符串下拉菜单部分的标题。-
项目Iterable<T>集合中的项目对象。 (动态)-
hideSelectedIconboolean项目被选中时是否隐藏选中图标。false
显示分隔线boolean是否显示组之间的分隔线。false
分隔线 PropsDividerProps分隔线组件的 Props。-
classNamesRecord<"base"| "heading"| "group"| "divider", string>允许为下拉菜单部分的插槽设置自定义类名。-
itemClassesRecord<"base"| "wrapper"| "title"| "description"| "shortcut" | "selectedIcon", string>允许为下拉菜单项插槽设置自定义类名。-

属性类型描述默认值
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-
referrerPolicyHTMLAttributeReferrerPolicy在点击链接时,要发送多少 referrer 信息。请参阅 MDN-
isDisabledboolean下拉菜单项是否应该被禁用。(已弃用)请将 disabledKeys 传递给 DropdownMenu 代替。false
isSelectedboolean下拉菜单项是否应该被选中。(已弃用)请将 selectedKeys 传递给 DropdownMenu 代替。false
isReadOnlyboolean下拉菜单项的点击事件是否应该被忽略。false
hideSelectedIconboolean当项目被选中时,是否隐藏复选框图标。false
closeOnSelectboolean下拉菜单在选择项目后是否应该关闭。true
classNamesRecord<"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当释放键时调用的处理程序。
onClickMouseEventHandler本机按钮点击事件处理程序 (已弃用) 使用 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;