选择
选择框显示一个可折叠的选项列表,允许用户选择其中一个或多个选项。
安装
npx nextui-cli@latest add select
以上命令仅用于单个安装。如果 @nextui-org/react
已经全局安装,则可以跳过此步骤。
导入
NextUI 导出 3 个与选择相关的组件
- Select: 主要组件,它是其他组件的包装器。
- SelectSection: 包含一组选择项的组件。
- SelectItem: 代表选择项的组件。
使用
动态项
Select 遵循 集合组件 API,接受静态和动态集合。
- 静态: 上面的使用示例展示了静态实现,当提前知道所有选项列表时可以使用它。
- 动态:以下示例适用于选项来自外部数据源(例如 API 调用)或随时间更新的情况。
多选
您可以使用 selectionMode="multiple"
属性来允许多选。
禁用
禁用项目
您可以使用 disabledKeys
属性来禁用特定项目。
必填
如果您将 isRequired
属性传递给选择器,它将在标签末尾显示一个 danger
星号,并且选择器将变为必填。
尺寸
颜色
变体
圆角
标签位置
您可以通过将 labelPlacement
属性设置为 inside
、outside
或 outside-left
来更改标签的位置。
注意: 如果未传递
label
,则labelPlacement
属性默认值为outside
。
开始内容
您可以使用 startContent
和 endContent
属性在选择框的开头和结尾添加内容。
项目开始和结束内容
由于 Select
组件在内部使用 Listbox 组件,您可以使用 startContent
和 endContent
属性在 SelectItem
组件的开头和结尾添加内容。
自定义选择器图标
默认情况下,选择器使用 chevron-down
图标作为选择器图标,当选择器打开时会旋转。您可以通过将自定义图标传递给 selectorIcon
属性来自定义此图标。
注意:使用
disableSelectorIconRotation
属性禁用图标的旋转。
无滚动阴影
选择器组件使用 ScrollShadow 在后台显示阴影,当选择器内容可滚动时。您可以通过使用 scrollShadowProps
属性禁用此阴影。
注意:您也可以使用
showScrollIndicators
属性禁用滚动指示器。
带有描述
您可以通过传递 description
属性来为选择添加描述。
带有错误消息
您可以结合使用 isInvalid
和 errorMessage
属性来显示无效的选择。
受控
您可以使用 selectedKeys
和 onSelectionChange
/ onChange
属性来控制选择的值。
使用 onSelectionChange
使用 onChange
控制打开状态
您可以使用 isOpen
和 onOpenChange
/ 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
组件。
多选控制
您可以使用与单选相同的属性来控制多选,selectedKeys
和 onSelectionChange
/ 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 组件还提供 popoverProps 和 listboxProps 属性来自定义弹出框和列表框组件。
插槽
- base: 选择的主包装器。它包装了其余的插槽。
- label: 选择的标签。
- mainWrapper: 包装
helperWrapper
和trigger
插槽。 - trigger: 选择的触发器。它包装了标签、内部包装器和选择器图标。
- innerWrapper: 选择内容的包装器。它包装了开始/结束内容和选择值。
- selectorIcon: 选择器的图标。当选择器打开时,此图标会旋转 (
data-open
)。 - value: 选择器的值。这也是包裹
renderValue
函数结果的插槽。 - listboxWrapper: 列表框的包装器。它包裹着列表框组件,此插槽用于滚动阴影组件的顶部。
- listbox: 列表框组件。它是包裹选择项的组件。
- popoverContent: 弹出框内容插槽。使用它可以修改弹出框内容的样式。
- helperWrapper: 辅助文本的包装器。它包裹着辅助文本和错误消息。
- description: 选择器的描述。
- errorMessage: 选择器的错误消息。
数据属性
Select
在 base
元素上具有以下属性
- data-filled: 指示选择器是否具有值、是否处于焦点、是否有开始/结束内容或是否打开。
- data-has-value: 指示选择器是否已选择项目。
- data-has-label: 指示选择器是否具有标签。基于
label
属性。 - data-has-helper: 指示选择器是否具有辅助文本。基于
errorMessage
或description
属性。 - data-invalid: 指示选择器是否无效。基于
isInvalid
属性。
Select
在 trigger
元素上具有以下属性
- data-open: 指示选择器是否打开。
- data-disabled: 当选择器触发器被禁用时。基于选择器
isDisabled
属性。 - data-focus: 当选择器触发器被聚焦时。基于 useFocusRing.
- data-focus-visible: 当选择器触发器使用键盘聚焦时。基于 useFocusRing.
- data-pressed: 当选择触发器被按下时。基于 usePress
- data-hover: 当选择触发器被悬停时。基于 useHover
Select
在 selectorIcon
元素上具有以下属性
- data-open: 指示选择器是否打开。
SelectItem
在 base
元素上具有以下属性
- 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[] | 要渲染的子元素。通常是 SelectItem 和 SelectSection 元素的列表。 | - |
items | Iterable<T> | 选择中的项目对象。(动态) | - |
selectionMode | single | multiple | 集合中允许的选择类型。 | - |
selectedKeys | all | React.Key[] | 集合中当前选中的键(受控)。 | - |
disabledKeys | all | React.Key[] | 被禁用的项目键。这些项目不能被选中、聚焦或以其他方式交互。 | - |
defaultSelectedKeys | all | React.Key[] | 集合中最初选中的键(不受控)。 | - |
variant | flat | bordered | faded | underlined | 选择的变体。 | flat |
color | default | 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 | 渲染为选择器图标的元素。 | - |
scrollRef | React.RefObject<HTMLElement> | 可滚动元素的引用。 | - |
spinnerRef | React.RefObject<HTMLElement> | 加载动画元素的引用。 | - |
fullWidth | boolean | 选择器是否应占据其父元素的宽度。 | true |
isOpen | boolean | 选择器是否默认打开(受控)。 | - |
defaultOpen | boolean | 选择器是否默认打开(非受控)。 | - |
isRequired | boolean | 在提交表单之前,是否需要用户在选择器中进行选择。 | false |
isDisabled | boolean | 选择器是否被禁用。 | false |
isMultiline | boolean | 选择器是否应允许多行文本。 | false |
isInvalid | boolean | 选择器是否无效。 | false |
validationState | valid | invalid | 选择器是否应显示其“有效”或“无效”的视觉样式。(已弃用)请使用 isInvalid 代替。 | - |
showScrollIndicators | boolean | 选择器在列表框可滚动时是否应显示滚动指示器。 | true |
autoFocus | boolean | 选择器是否应在首次挂载时获得焦点。 | false |
disallowEmptySelection | boolean | 集合是否允许空选择。 | false |
disableAnimation | boolean | 选择器是否应进行动画。 | true |
disableSelectorIconRotation | boolean | 选择器是否应禁用选择器图标的旋转。 | false |
popoverProps | PopoverProps | 要传递给弹出框组件的属性。 | - |
listboxProps | ListboxProps | 要传递给列表框组件的属性。 | - |
scrollShadowProps | ScrollShadowProps | 要传递给滚动阴影组件的属性。 | - |
classNames | Record<"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 | 选中键值改变时触发的回调函数。 |
onChange | React.ChangeEvent<HTMLSelectElement> | 原生选择改变事件,在选中值改变时触发。 |
renderValue | RenderValueFunction | 用于渲染选择框值的函数。默认情况下,它渲染选中的项目。 |
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;