Skyroc UI
输入

Combobox

可搜索的下拉选择器,由 Popover、Command 和 Button 组合而成

组合选择器(Combobox)是一种常见的输入模式,允许用户在弹出面板中通过关键词搜索并选择选项。它不是一个独立组件,而是由 Popover(弹出容器)、Command(可搜索列表)和 Button(触发器)三个组件组合实现。

import { Button, Command, Popover, cn } from '@skyroc/web-ui';

架构说明

Combobox 由三个组件协作完成:

  • Popover:提供弹出层容器,管理打开/关闭状态。
  • Command:数据驱动的可搜索列表,接收 items 数组自动渲染选项、分组和分隔符。
  • Button:作为 Popovertrigger,展示当前选中值和下拉指示器。

组合方式:

<Popover trigger={<Button>...</Button>}>
  <Command items={[...]} />
</Popover>

何时使用

  • 选项较多(超过 5 个),需要搜索过滤时。
  • 需要在弹出面板中展示结构化选项(分组、分隔符、快捷键)。
  • 替代原生 <select>,需要更丰富的选项展示和交互。
  • 与 Select 组件的区分:Combobox 侧重「搜索 + 选择」,Select 侧重「浏览 + 选择」。

基础用法

通过 Popover 包裹 Command,将 Button 作为触发器。Commanditems 接收选项数组,每个选项包含 label(显示文本)和 value(匹配值)。

Preview
Code
Loading...

API

Command

数据驱动的可搜索命令面板。继承 CommandRoot 的所有属性,支持通过 items 数组声明式渲染选项。

属性说明类型默认值
items*选项数据数组,支持 item、group、separator 三种类型CommandOptionData[]-
empty无匹配结果时显示的内容ReactNode'No results.'
inputProps传递给搜索输入框的属性CommandInputProps-
classNames各 slot 的自定义 classCommandClassNames-
size尺寸,影响所有子组件的字号与间距'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl''md'
className根容器的 class,优先级低于 classNames.rootClassValue-

选项数据结构

items 数组中的每个元素通过 type 字段区分类型:

类型说明必填字段
item可选择的选项(默认类型)label
group选项分组children
separator分隔线type 必须显式

选项(item)

属性说明类型默认值
label选项显示文本ReactNode-
value选项值,用于搜索匹配和选中标识string-
onSelect选中时触发的回调(value: string) => void-
disabled是否禁用boolean-
keywords额外搜索关键词,不影响显示string[]-
leading前置插槽,位于 label 之前ReactNode-
trailing后置插槽,位于 label 之后ReactNode-
shortcut关联的键盘快捷键string | string[]-
className选项的 classClassValue-
size选项尺寸'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'-

分组(group)

属性说明类型默认值
children*分组内的子选项数组CommandOptionData[]-
label分组标题ReactNode-
className分组容器的 classClassValue-
classNames分组内各 slot 的 class(group / groupLabel)Pick<CommandClassNames, 'group' | 'groupLabel'>-

类型

CommandClassNames

Command 各 slot 的自定义 class 配置。

字段类型说明
rootClassValue根容器。
listClassValue列表容器。
emptyClassValue空状态区域。
inputClassValue搜索输入框。
inputWrapperClassValue输入框外层包裹区。
inputIconClassValue搜索图标。
itemClassValue选项行。
itemIconClassValue选项图标。
groupClassValue分组容器。
groupLabelClassValue分组标题。
separatorClassValue分隔线。
shortcutClassValue快捷键展示区。
dialogClassValue对话框模式容器。

CommandInputProps

搜索输入框属性。继承 cmdk CommandInput 的属性,并增加 className、size 和 slot 插槽。

字段类型说明
placeholderstring输入框占位文本。
valuestring受控搜索文本。
onValueChange(search: string) => void搜索文本变化时触发。
leadingReactNode前置插槽,默认为搜索图标。
trailingReactNode后置插槽。
classNameClassValue输入框 class。
classNamesPick<CommandClassNames, 'input' | 'inputIcon' | 'inputWrapper'>输入框相关 slot 的 class。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'输入框尺寸。

CommandItemOptionProps

选项数据结构。继承 CommandItem 的属性(排除 children),通过 label 显示文本。

字段类型说明
labelReactNode选项显示文本。
type'item'标识为选项类型,可省略。
valuestring选项值,用于搜索匹配。
onSelect(value: string) => void选中时回调。
disabledboolean是否禁用。
keywordsstring[]额外搜索关键词。
leadingReactNode前置插槽。
trailingReactNode后置插槽。
shortcutstring | string[]关联键盘快捷键。
classNameClassValue选项 class。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'选项尺寸。

CommandGroupOptionProps

分组数据结构。将多个选项归入同一分组,显示分组标题。

字段类型说明
children*CommandOptionData[]分组内的子选项数组。
labelReactNode分组标题文本。
type'group'标识为分组类型,可省略(含 children 字段时自动识别)。
classNameClassValue分组容器 class。
classNamesPick<CommandClassNames, 'group' | 'groupLabel'>分组内 slot class。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'分组尺寸。

CommandSeparatorOptionProps

分隔线数据结构。在选项列表中插入视觉分隔。

字段类型说明
type*'separator'标识为分隔线类型,必须显式指定。
classNameClassValue分隔线 class。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'分隔线尺寸。

CommandOptionData

选项数据联合类型,每个元素可以是选项、分组或分隔线

ClassValue

CSS 类名类型

string | null | undefined | Record<string, boolean> | ClassValue[]

On this page