列表框

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


安装

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 道具为列表框项添加描述。

带顶部和底部内容

您可以使用 topContentbottomContent 道具在列表框项的上面和下面添加内容。

带部分

您可以使用 ListboxSection 组件对列表框项进行分组。

注意:没有 title 的部分必须提供一个 aria-label 以确保可访问性。

路由

The <ListboxItem> 组件与框架和客户端路由器(如 Next.jsReact 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 个组件,它们有插槽,基本组件是 ListboxListboxItemListboxSection 组件。

Listbox

  • base: Listbox 组件的主要包装器。此插槽包装了 topContentbottomContentlist 插槽。
  • list: Listbox 组件的插槽。您可以将此插槽视为 ul 插槽。
  • emptyContent: 集合为空时显示的插槽内容。

ListboxItem

  • base: Listbox 项的主要插槽。它包装了所有其他插槽。
  • wrapper: titledescription 的包装器。
  • title: 列表框项目的标题。
  • description: 列表框项目的描述。
  • selectedIcon: 选定图标插槽。仅当项目被选中时可见。

ListboxSection

  • base: 列表框部分的主插槽。它包装所有其他插槽。
  • heading: 在部分组顶部渲染的标题。
  • group: 列表框项目的组。
  • divider: 在组之间渲染的分隔符。仅当 showDividertrue 时可见。

自定义列表框

您可以使用 itemClasses 道具并传递自定义 Tailwind CSS 类来自定义 Listbox 项目样式。

注意:在上面的示例中,我们使用了 Boxicons 图标集合。

键盘交互

描述
Home将焦点移动到第一个项目。
End将焦点移动到最后一个项目。
ArrowDown当焦点在某个项目上时,将焦点移动到下一个项目。
ArrowUp当焦点在某个项目上时,将焦点移动到上一个项目。
EnterSpace当焦点在某个项目上时,选择该项目。
A-Za-z将焦点移动到下一个菜单项,该菜单项的标签以键入的字符开头(如果存在这样的菜单项)。

数据属性

ListboxItembase 元素上具有以下属性

  • 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[]要渲染的子元素。通常是 ListboxItemListboxSection 的列表-
itemsIterable<T>集合中的项目对象。(动态)-
variantsolid | 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
topContentReactNode在列表框项目上方显示的内容。-
bottomContentReactNode在列表框项目下方显示的内容。-
emptyContentReactNode当集合为空时显示的内容。没有项目。
shouldFocusWrap布尔值键盘导航是否循环。false
hideEmptyContent布尔值当集合为空时是否不显示空内容。false
hideSelectedIcon布尔值是否隐藏项目被选中时的选中图标。false
disableAnimation布尔值是否禁用列表框项目的动画。false
classNamesRecord<"base"| "list"| "emptyContent", string>允许为列表框插槽设置自定义类名。-
itemClassesRecord<"base"| "wrapper"| "title"| "description"| "selectedIcon", string>允许为列表框项目插槽设置自定义类名。-

Listbox 事件

属性类型描述
onAction(key: React.Key) => void选中项目时调用的处理程序。
onSelectionChange(keys: React.Key[]) => void选择更改时调用的处理程序。

ListboxSection 属性

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

ListboxItem 属性

属性类型描述默认值
children*ReactNode列表框项目的內容。-
React.Key列表框项目的唯一键。-
标题字符串 | ReactNode列表框项目的标题。-
文本值字符串项目内容的字符串表示,用于诸如类型提前之类的功能。-
描述字符串 | ReactNode列表框项目的描述。-
快捷键字符串 | ReactNode列表框项目的键盘快捷键。-
开始内容ReactNode列表框项目的开始内容。-
结束内容ReactNode列表框项目的结束内容。它位于快捷键和选中图标之后。-
选中图标SelectedIconProps项目被选中时渲染的自定义图标。-
href字符串链接到的 URL。参见 MDN-
targetHTMLAttributeAnchorTarget链接的目标窗口。参见 MDN-
rel字符串链接资源与当前页面之间的关系。参见 MDN-
downloadboolean | string导致浏览器下载链接的 URL。可以提供一个字符串来建议文件名。参见 MDN-
ping字符串当链接被点击时,要 ping 的 URL 的空格分隔列表。参见 MDN-
referrerPolicyHTMLAttributeReferrerPolicy在点击链接时,发送多少referrer信息。参见 MDN.-
聚焦时应突出显示布尔值是否应该高亮显示聚焦的项目。它会对项目应用与悬停时相同的样式。false
hideSelectedIcon布尔值是否在项目被选中时隐藏复选框图标。false
显示分隔符布尔值是否在项目下方显示分隔线。false
isDisabled布尔值列表框项目是否应该被禁用。(已弃用) 改为将 disabledKeys 传递给 Listboxfalse
isSelected布尔值列表框项目是否应该被选中。(已弃用) 改为将 selectedKeys 传递给 Listboxfalse
isReadOnly布尔值是否应该忽略列表框项目的点击事件。false
classNamesRecord<"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释放键时调用的处理程序。
onClickMouseEventHandler本机按钮点击事件处理程序 (已弃用) 使用 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;