列表框
列表框显示选项列表,并允许用户选择其中一个或多个选项。
安装
npx nextui-cli@latest add listbox
以上命令仅用于单独安装。如果 @nextui-org/react
已经全局安装,可以跳过此步骤。
导入
NextUI 导出 3 个与列表框相关的组件
- 列表框: 主要组件,它是其他组件的包装器。
- 列表框节: 包含一组列表框项目的组件。
- 列表框项: 代表列表框项目的组件。
用法
动态项目
列表框遵循 集合组件 API,接受静态和动态集合。
- 静态: 上面的用法示例展示了静态实现,当提前知道所有选项列表时可以使用它。
- 动态: 下面的示例可以在选项来自外部数据源(例如 API 调用)或随时间更新时使用。
禁用键
列表框项目可以使用 disabledKeys
属性禁用,该属性应用于 Listbox
组件。
注意:每个项目都必须具有唯一的键,否则禁用键将不起作用。
变体
您可以使用 variant
属性更改 Listbox
组件中列表框项目的 hover
样式。
单选
您可以将 selectionMode
属性设置为 single
,以允许用户一次只选择一项。
多选
您可以将 selectionMode
属性设置为 multiple
,以允许用户一次选择多项。
注意:要允许空选择,您可以将
disallowEmptySelection
属性设置为false
。
带图标
可以使用 startContent
/ endContent
属性将图标添加到列表框项中。
注意:如果您使用
currentColor
作为图标颜色,则图标将与项目文本具有相同的颜色。
带描述
您可以使用 description
道具为列表框项添加描述。
带顶部和底部内容
您可以使用 topContent
和 bottomContent
道具在列表框项的上面和下面添加内容。
带部分
您可以使用 ListboxSection
组件对列表框项进行分组。
注意:没有
title
的部分必须提供一个aria-label
以确保可访问性。
路由
The <ListboxItem>
组件与框架和客户端路由器(如 Next.js 和 React Router)一起工作。请参阅 路由 指南,了解如何设置它。
import {Listbox, ListboxItem} from "@nextui-org/react";function App() {return (<Listbox><ListboxItem key="home" href="/home">Home</ListboxItem><ListboxItem key="about" href="/about">About</ListboxItem></Listbox>);}
插槽
Listbox 有 3 个组件,它们有插槽,基本组件是 Listbox
、ListboxItem
和 ListboxSection
组件。
Listbox
- base: Listbox 组件的主要包装器。此插槽包装了
topContent
、bottomContent
和list
插槽。 - list: Listbox 组件的插槽。您可以将此插槽视为
ul
插槽。 - emptyContent: 集合为空时显示的插槽内容。
ListboxItem
- base: Listbox 项的主要插槽。它包装了所有其他插槽。
- wrapper:
title
和description
的包装器。 - title: 列表框项目的标题。
- description: 列表框项目的描述。
- selectedIcon: 选定图标插槽。仅当项目被选中时可见。
ListboxSection
- base: 列表框部分的主插槽。它包装所有其他插槽。
- heading: 在部分组顶部渲染的标题。
- group: 列表框项目的组。
- divider: 在组之间渲染的分隔符。仅当
showDivider
为true
时可见。
自定义列表框
您可以使用 itemClasses
道具并传递自定义 Tailwind CSS 类来自定义 Listbox
项目样式。
注意:在上面的示例中,我们使用了 Boxicons 图标集合。
键盘交互
键 | 描述 |
---|---|
Home | 将焦点移动到第一个项目。 |
End | 将焦点移动到最后一个项目。 |
ArrowDown | 当焦点在某个项目上时,将焦点移动到下一个项目。 |
ArrowUp | 当焦点在某个项目上时,将焦点移动到上一个项目。 |
Enter 或 Space | 当焦点在某个项目上时,选择该项目。 |
A-Z 或 a-z | 将焦点移动到下一个菜单项,该菜单项的标签以键入的字符开头(如果存在这样的菜单项)。 |
数据属性
ListboxItem
在 base
元素上具有以下属性
- data-disabled: 当列表框项被禁用时。基于列表框
disabledKeys
属性。 - data-selected: 当列表框项被选中时。基于列表框
selectedKeys
属性。 - data-selectable: 当列表框项可被选中时。基于列表框
selectionMode
属性。 - data-hover: 当鼠标悬停在列表框项上时。基于 useHover
- data-pressed: 当按下列表框项时。基于 usePress
- data-focus: 当列表框项目被聚焦时。基于 useFocusRing.
- data-focus-visible: 当列表框项目使用键盘聚焦时。基于 useFocusRing.
无障碍性
- 通过 ARIA 暴露给辅助技术作为
listbox
。 - 支持单选、多选或不选择。
- 支持禁用项目。
- 支持分节。
- 支持无障碍性标签。
- 支持鼠标、触摸和键盘交互。
- 选项卡焦点管理。
- 支持键盘导航,包括箭头键、Home/End、Page Up/Down、全选和清除。
- 在键盘导航期间自动滚动支持。
- 通过输入文本来允许聚焦选项的自动完成功能。
API
Listbox 属性
属性 | 类型 | 描述 | 默认值 |
---|---|---|---|
children* | ReactNode[] | 要渲染的子元素。通常是 ListboxItem 或 ListboxSection 的列表 | - |
items | Iterable<T> | 集合中的项目对象。(动态) | - |
variant | solid | bordered | light | flat | faded | shadow | 列表框项目的显示样式。 | solid |
颜色 | default | primary | secondary | success | warning | danger | 列表框项的颜色主题。 | 默认 |
选择模式 | none | single | multiple | 集合中允许的选择类型。 | - |
选定键 | React.Key[] | 集合中当前选定的键(受控)。 | - |
禁用键 | React.Key[] | 被禁用的项目键。这些项目无法被选中、聚焦或以其他方式交互。 | - |
默认选定键 | all | React.Key[] | 集合中最初选定的键(不受控)。 | - |
不允许空选择 | 布尔值 | 集合是否允许空选择。 | false |
聚焦时应突出显示 | 布尔值 | 是否应突出显示聚焦的项目。它对项目应用与悬停时相同的样式。 | false |
自动聚焦 | boolean | first | last | 设置焦点的位置。 | false |
topContent | ReactNode | 在列表框项目上方显示的内容。 | - |
bottomContent | ReactNode | 在列表框项目下方显示的内容。 | - |
emptyContent | ReactNode | 当集合为空时显示的内容。 | 没有项目。 |
shouldFocusWrap | 布尔值 | 键盘导航是否循环。 | false |
hideEmptyContent | 布尔值 | 当集合为空时是否不显示空内容。 | false |
hideSelectedIcon | 布尔值 | 是否隐藏项目被选中时的选中图标。 | false |
disableAnimation | 布尔值 | 是否禁用列表框项目的动画。 | false |
classNames | Record<"base"| "list"| "emptyContent", string> | 允许为列表框插槽设置自定义类名。 | - |
itemClasses | Record<"base"| "wrapper"| "title"| "description"| "selectedIcon", string> | 允许为列表框项目插槽设置自定义类名。 | - |
Listbox 事件
属性 | 类型 | 描述 |
---|---|---|
onAction | (key: React.Key) => void | 选中项目时调用的处理程序。 |
onSelectionChange | (keys: React.Key[]) => void | 选择更改时调用的处理程序。 |
ListboxSection 属性
属性 | 类型 | 描述 | 默认值 |
---|---|---|---|
children* | ReactNode | 列表框部分的内容。通常是一系列的 ListboxItem 组件。(静态) | - |
标题 | 字符串 | 列表框部分的标题。 | - |
items | Iterable<T> | 集合中的项目对象。(动态) | - |
hideSelectedIcon | 布尔值 | 是否隐藏项目被选中时的选中图标。 | false |
显示分隔符 | 布尔值 | 是否显示组之间的分隔符。 | false |
分隔符属性 | DividerProps | 分隔符组件属性。 | - |
classNames | Record<"base"| "heading"| "group"| "divider", string> | 允许为列表框部分的插槽设置自定义类名。 | - |
itemClasses | Record<"base"| "wrapper"| "title"| "description"| "shortcut" | "selectedIcon", string> | 允许为列表框项目插槽设置自定义类名。 | - |
ListboxItem 属性
属性 | 类型 | 描述 | 默认值 |
---|---|---|---|
children* | ReactNode | 列表框项目的內容。 | - |
键 | React.Key | 列表框项目的唯一键。 | - |
标题 | 字符串 | ReactNode | 列表框项目的标题。 | - |
文本值 | 字符串 | 项目内容的字符串表示,用于诸如类型提前之类的功能。 | - |
描述 | 字符串 | ReactNode | 列表框项目的描述。 | - |
快捷键 | 字符串 | ReactNode | 列表框项目的键盘快捷键。 | - |
开始内容 | ReactNode | 列表框项目的开始内容。 | - |
结束内容 | ReactNode | 列表框项目的结束内容。它位于快捷键和选中图标之后。 | - |
选中图标 | SelectedIconProps | 项目被选中时渲染的自定义图标。 | - |
href | 字符串 | 链接到的 URL。参见 MDN。 | - |
target | HTMLAttributeAnchorTarget | 链接的目标窗口。参见 MDN。 | - |
rel | 字符串 | 链接资源与当前页面之间的关系。参见 MDN。 | - |
download | boolean | string | 导致浏览器下载链接的 URL。可以提供一个字符串来建议文件名。参见 MDN。 | - |
ping | 字符串 | 当链接被点击时,要 ping 的 URL 的空格分隔列表。参见 MDN。 | - |
referrerPolicy | HTMLAttributeReferrerPolicy | 在点击链接时,发送多少referrer信息。参见 MDN. | - |
聚焦时应突出显示 | 布尔值 | 是否应该高亮显示聚焦的项目。它会对项目应用与悬停时相同的样式。 | false |
hideSelectedIcon | 布尔值 | 是否在项目被选中时隐藏复选框图标。 | false |
显示分隔符 | 布尔值 | 是否在项目下方显示分隔线。 | false |
isDisabled | 布尔值 | 列表框项目是否应该被禁用。(已弃用) 改为将 disabledKeys 传递给 Listbox 。 | false |
isSelected | 布尔值 | 列表框项目是否应该被选中。(已弃用) 改为将 selectedKeys 传递给 Listbox 。 | false |
isReadOnly | 布尔值 | 是否应该忽略列表框项目的点击事件。 | false |
classNames | Record<"base"| "wrapper"| "title"| "description"| "shortcut" | "selectedIcon", string> | 允许为列表框项目插槽设置自定义类名。 | - |
ListboxItem 事件
属性 | 类型 | 描述 |
---|---|---|
onAction | () => void | 当列表框项目被选中时调用的处理程序。(已弃用) 改为传递给 Listbox 。 |
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 ListboxItemSelectedIconProps = {/*** 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: ListboxItemSelectedIconProps) => ReactNode) | null;