选择

选择框显示一个可折叠的选项列表,允许用户选择其中一个或多个选项。


安装

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

导入

NextUI 导出 3 个与选择相关的组件

  • Select: 主要组件,它是其他组件的包装器。
  • SelectSection: 包含一组选择项的组件。
  • SelectItem: 代表选择项的组件。

使用

动态项

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

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

多选

您可以使用 selectionMode="multiple" 属性来允许多选。

禁用

禁用项目

您可以使用 disabledKeys 属性来禁用特定项目。

必填

如果您将 isRequired 属性传递给选择器,它将在标签末尾显示一个 danger 星号,并且选择器将变为必填。

尺寸

颜色

变体

圆角

标签位置

您可以通过将 labelPlacement 属性设置为 insideoutsideoutside-left 来更改标签的位置。

注意: 如果未传递 label,则 labelPlacement 属性默认值为 outside

开始内容

您可以使用 startContentendContent 属性在选择框的开头和结尾添加内容。

项目开始和结束内容

由于 Select 组件在内部使用 Listbox 组件,您可以使用 startContentendContent 属性在 SelectItem 组件的开头和结尾添加内容。

自定义选择器图标

默认情况下,选择器使用 chevron-down 图标作为选择器图标,当选择器打开时会旋转。您可以通过将自定义图标传递给 selectorIcon 属性来自定义此图标。

注意:使用 disableSelectorIconRotation 属性禁用图标的旋转。

无滚动阴影

选择器组件使用 ScrollShadow 在后台显示阴影,当选择器内容可滚动时。您可以通过使用 scrollShadowProps 属性禁用此阴影。

注意:您也可以使用 showScrollIndicators 属性禁用滚动指示器。

带有描述

您可以通过传递 description 属性来为选择添加描述。

带有错误消息

您可以结合使用 isInvaliderrorMessage 属性来显示无效的选择。

受控

您可以使用 selectedKeysonSelectionChange / onChange 属性来控制选择的值。

使用 onSelectionChange

使用 onChange

控制打开状态

您可以使用 isOpenonOpenChange / onClose 属性来控制下拉菜单的打开状态。

自定义项目

您可以通过修改 SelectItem 子元素来自定义下拉菜单项目。

自定义渲染值

默认情况下,下拉菜单将渲染选定项目的文本值,但您可以通过传递一个 renderValue 函数来自定义它。

The renderValue function receives the selected items as a parameter and must return a ReactNode. Check the Render Value Function section for more details.

异步加载

Select 支持异步加载,在下面的示例中,我们使用自定义钩子来获取 Pokemon API 数据,并结合 useInfiniteScroll 钩子,当用户到达列表末尾时加载更多数据。

The isLoading prop is used to show a loading indicator instead of the selector icon when the data is being fetched.

npm install @nextui-org/use-infinite-scroll
import {useInfiniteScroll} from "@nextui-org/use-infinite-scroll";

带节

您可以使用 SelectSection 组件来对选择项进行分组。

自定义部分样式

您可以使用 classNames 属性来自定义部分样式 SelectSection 组件。

多选控制

您可以使用与单选相同的属性来控制多选,selectedKeysonSelectionChange / onChange

使用 onSelectionChange

使用 onChange

带芯片的多选

您可以使用 renderValue 属性将任何组件渲染为选择值。在本例中,我们使用 Chip 组件来渲染选定的项目。

注意: 确保将 isMultiline 属性传递给 Select 组件以允许芯片换行。

The renderValue function receives the selected items as a parameter and must return a ReactNode. Check the Render Value Function section for more details.

自定义选择

您可以使用 classNames 属性自定义选择的任何插槽。Select 组件还提供 popoverPropslistboxProps 属性来自定义弹出框和列表框组件。

插槽

  • base: 选择的主包装器。它包装了其余的插槽。
  • label: 选择的标签。
  • mainWrapper: 包装 helperWrappertrigger 插槽。
  • trigger: 选择的触发器。它包装了标签、内部包装器和选择器图标。
  • innerWrapper: 选择内容的包装器。它包装了开始/结束内容和选择值。
  • selectorIcon: 选择器的图标。当选择器打开时,此图标会旋转 (data-open)。
  • value: 选择器的值。这也是包裹 renderValue 函数结果的插槽。
  • listboxWrapper: 列表框的包装器。它包裹着列表框组件,此插槽用于滚动阴影组件的顶部。
  • listbox: 列表框组件。它是包裹选择项的组件。
  • popoverContent: 弹出框内容插槽。使用它可以修改弹出框内容的样式。
  • helperWrapper: 辅助文本的包装器。它包裹着辅助文本和错误消息。
  • description: 选择器的描述。
  • errorMessage: 选择器的错误消息。

数据属性

Selectbase 元素上具有以下属性

  • data-filled: 指示选择器是否具有值、是否处于焦点、是否有开始/结束内容或是否打开。
  • data-has-value: 指示选择器是否已选择项目。
  • data-has-label: 指示选择器是否具有标签。基于 label 属性。
  • data-has-helper: 指示选择器是否具有辅助文本。基于 errorMessagedescription 属性。
  • data-invalid: 指示选择器是否无效。基于 isInvalid 属性。

Selecttrigger 元素上具有以下属性

  • data-open: 指示选择器是否打开。
  • data-disabled: 当选择器触发器被禁用时。基于选择器 isDisabled 属性。
  • data-focus: 当选择器触发器被聚焦时。基于 useFocusRing.
  • data-focus-visible: 当选择器触发器使用键盘聚焦时。基于 useFocusRing.
  • data-pressed: 当选择触发器被按下时。基于 usePress
  • data-hover: 当选择触发器被悬停时。基于 useHover

SelectselectorIcon 元素上具有以下属性

  • data-open: 指示选择器是否打开。

SelectItembase 元素上具有以下属性

  • data-disabled: 当选择项被禁用时。基于选择 disabledKeys 属性。
  • data-selected: 当选择项被选中时。基于选择 selectedKeys 属性。
  • data-hover: 当选择项被悬停时。基于 useHover
  • data-pressed: 当选择项被按下时。基于 usePress
  • data-focus: 当选择项被聚焦时。基于 useFocusRing.
  • data-focus-visible: 当选择项通过键盘被聚焦时。基于 useFocusRing.

无障碍性

  • 作为带有列表框弹出窗口的按钮,使用 ARIA(与 Listbox 结合)暴露给辅助技术。
  • 支持选择单个选项。
  • 支持选择多个选项。
  • 支持禁用选项。
  • 支持分段。
  • 支持可访问性标签。
  • 支持通过 ARIA 链接到输入的描述和错误消息帮助文本。
  • 支持鼠标、触控和键盘交互。
  • 制表符焦点管理。
  • 键盘支持使用箭头键打开列表框,包括自动聚焦第一个或最后一个项目。
  • 类型提前输入,允许通过输入文本选择选项,即使没有打开列表框。
  • 通过隐藏的原生 <select> 元素集成浏览器自动填充功能。
  • 支持通过软件键盘进行移动表单导航。
  • 支持移动屏幕阅读器关闭列表框。

API

Select 属性

属性类型描述默认值
children*ReactNode[]要渲染的子元素。通常是 SelectItemSelectSection 元素的列表。-
itemsIterable<T>选择中的项目对象。(动态)-
selectionModesingle | multiple集合中允许的选择类型。-
selectedKeysall | React.Key[]集合中当前选中的键(受控)。-
disabledKeysall | React.Key[]被禁用的项目键。这些项目不能被选中、聚焦或以其他方式交互。-
defaultSelectedKeysall | React.Key[]集合中最初选中的键(不受控)。-
variantflat | bordered | faded | underlined选择的变体。flat
colordefault | primary | secondary | success | warning | danger选择框的颜色。default
大小sm | md | lg选择框的大小。md
圆角none | sm | md | lg | full选择框的圆角。-
占位符string选择框的占位符。选择一个选项
标签位置inside | outside | outside-left标签的位置。inside
标签ReactNode作为标签显示的内容。-
描述ReactNode选择框的描述。提供提示,例如对选择内容的具体要求。-
错误信息ReactNode | ((v: ValidationResult) => ReactNode)选择框的错误信息。-
开始内容ReactNode渲染在选择框左侧的元素。-
结束内容ReactNode渲染在选择框右侧的元素。-
选择器图标ReactNode渲染为选择器图标的元素。-
scrollRefReact.RefObject<HTMLElement>可滚动元素的引用。-
spinnerRefReact.RefObject<HTMLElement>加载动画元素的引用。-
fullWidthboolean选择器是否应占据其父元素的宽度。true
isOpenboolean选择器是否默认打开(受控)。-
defaultOpenboolean选择器是否默认打开(非受控)。-
isRequiredboolean在提交表单之前,是否需要用户在选择器中进行选择。false
isDisabledboolean选择器是否被禁用。false
isMultilineboolean选择器是否应允许多行文本。false
isInvalidboolean选择器是否无效。false
validationStatevalid | invalid选择器是否应显示其“有效”或“无效”的视觉样式。(已弃用)请使用 isInvalid 代替。-
showScrollIndicatorsboolean选择器在列表框可滚动时是否应显示滚动指示器。true
autoFocusboolean选择器是否应在首次挂载时获得焦点。false
disallowEmptySelectionboolean集合是否允许空选择。false
disableAnimationboolean选择器是否应进行动画。true
disableSelectorIconRotationboolean选择器是否应禁用选择器图标的旋转。false
popoverPropsPopoverProps要传递给弹出框组件的属性。-
listboxPropsListboxProps要传递给列表框组件的属性。-
scrollShadowPropsScrollShadowProps要传递给滚动阴影组件的属性。-
classNamesRecord<"base"| "label"| "trigger"| "mainWrapper" | "innerWrapper"| "selectorIcon" | "value" | "listboxWrapper"| "listbox" | "popoverContent" | "helperWrapper" | "description" | "errorMessage", string>允许为选择器插槽设置自定义类名。-

选择器事件

属性类型描述
onClose() => void选择弹出框关闭时触发的回调函数。
onOpenChange(isOpen: boolean) => void选择弹出框打开或关闭时触发的回调函数。
onSelectionChange(keys: React.Key[]) => void选中键值改变时触发的回调函数。
onChangeReact.ChangeEvent<HTMLSelectElement>原生选择改变事件,在选中值改变时触发。
renderValueRenderValueFunction用于渲染选择框值的函数。默认情况下,它渲染选中的项目。

SelectItem Props

查看 ListboxItem 属性。

SelectItem Events

查看 ListboxItem 事件。

SelectSection Props

查看 ListboxSection 属性。


类型

渲染值函数

The T 类型是传递给选择 items 的数据的类型。

export type SelectedItemProps<T> = {
/** A unique key for the item. */
key?: Key;
/** The props passed to the item. */
props?: Record<string, any>;
/** The item data. */
data?: T | null;
/** An accessibility label for this item. */
"aria-label"?: string;
/** The rendered contents of this item (e.g. JSX). */
rendered?: ReactNode;
/** A string value for this item, used for features like typeahead. */
textValue?: string;
/** The type of item this item represents. */
type?: string;
};
type SelectedItems<T> = Array<SelectedItemProps<T>>;
renderValue: (items: SelectedItems<T>) => ReactNode;