弹层覆盖
Command
用于搜索、筛选并执行命令的命令面板组件
命令面板(Command)基于 cmdk 封装,用于构建可搜索的操作入口、快捷跳转、全局命令菜单或局部筛选列表。
import {
Command,
CommandDialog,
CommandEmpty,
CommandGroup,
CommandInput,
CommandItem,
CommandList,
CommandLoading,
CommandRoot,
CommandSeparator,
CommandShortcut
} from '@skyroc/web-ui';架构说明
Command 提供两种使用方式:主组件通过 items 数据驱动渲染完整命令面板;基础子组件可用于更细粒度的自定义组合。
Command:数据驱动主组件,自动组合输入框、列表、空状态和选项。CommandDialog:用 Dialog 包裹的命令面板,适合全局快捷命令入口。CommandRoot:cmdk 根容器。CommandInput:搜索输入框,默认带搜索图标,支持前后插槽。CommandList:命令列表滚动容器。CommandGroup:分组容器,支持分组标题。CommandItem:单个命令项,支持前置图标、后置内容和快捷键。CommandSeparator:分隔线。CommandEmpty:无匹配结果时显示。CommandShortcut:快捷键展示。CommandLoading:直接从 cmdk 透出,用于加载状态。
何时使用
- 需要通过输入快速筛选并执行操作时。
- 需要构建全局命令菜单、快捷跳转或应用内搜索入口时。
- 命令项需要分组、图标、快捷键和空状态时。
- 如果只是普通下拉选择,优先使用 Select;如果只是简单菜单,优先使用 DropdownMenu 或 Menu。
基础用法
通过 items 传入命令数据。每个 option 可以是分组、分隔线或单个命令项。
Preview
Code
Loading...
弹窗命令面板
CommandDialog 提供 Dialog 容器,适合全局命令面板。打开状态通过 open 和 onOpenChange 控制。
Preview
Code
Loading...
数据结构
items 支持三种节点:
| 类型 | 识别方式 | 说明 |
|---|---|---|
| item | 默认,或 type: 'item' | 可选择命令项 |
| group | 包含 children,或 type: 'group' | 分组选项 |
| separator | type: 'separator' | 分隔线 |
API
Command
通用属性参考:根容器支持 cmdk Command Root 的属性;主组件使用 items 数据驱动渲染,不接收自定义 children。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| items* | 命令选项数据,支持 item / group / separator | CommandOptionData[] | - |
| empty | 无匹配结果时显示的内容 | ReactNode | 'No results.' |
| inputProps | 传递给 CommandInput 的属性 | CommandInputProps | - |
| size | 尺寸,影响输入框、列表、选项和快捷键间距 | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'md' |
| className | 根容器 class;存在时优先于 classNames.root | ClassValue | - |
| classNames | 各 slot 的自定义 class | CommandClassNames | - |
| value | cmdk 受控搜索值 | string | - |
| onValueChange | cmdk 搜索值变化回调 | (value: string) => void | - |
| filter | cmdk 自定义筛选函数 | (value: string, search: string, keywords?: string[]) => number | - |
| shouldFilter | 是否启用 cmdk 内置筛选 | boolean | - |
CommandDialog
CommandDialog 负责 Dialog 外壳,命令内容通常放入其 children 中。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| children | 弹窗内容,通常是 Command | ReactNode | - |
| open | 受控打开状态 | boolean | - |
| defaultOpen | 非受控默认打开状态 | boolean | - |
| onOpenChange | 打开状态变化回调 | (open: boolean) => void | - |
| title | 弹窗标题 | ReactNode | - |
| description | 弹窗描述 | ReactNode | - |
| className | 内容容器 class;存在时优先于 classNames.content | ClassValue | - |
| classNames | Dialog 相关 slot class | CommandDialogClassNames | - |
| size | 内容容器尺寸,透传给 DialogContent | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | - |
子组件
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| CommandRoot | cmdk 根容器 | CommandRootProps | - |
| CommandInput | 搜索输入框 | CommandInputProps | - |
| CommandList | 命令列表容器 | CommandListProps | - |
| CommandEmpty | 空状态内容 | CommandEmptyProps | - |
| CommandGroup | 命令分组容器 | CommandGroupProps | - |
| CommandItem | 单个命令项 | CommandItemProps | - |
| CommandSeparator | 分隔线 | CommandSeparatorProps | - |
| CommandShortcut | 快捷键展示 | CommandShortcutProps | - |
类型
CommandProps
主组件属性。继承 CommandRootProps,但使用 items 数据驱动渲染命令列表。
| 字段 | 类型 | 说明 |
|---|---|---|
| items* | CommandOptionData[] | 命令选项数据。 |
| empty | ReactNode | 空状态内容。 |
| inputProps | CommandInputProps | 输入框属性。 |
| className | ClassValue | 根容器 class。 |
| classNames | CommandClassNames | 各 slot 的自定义 class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸。 |
| value | string | cmdk 搜索值。来自 CommandRootProps。 |
| onValueChange | (value: string) => void | 搜索值变化回调。来自 CommandRootProps。 |
| filter | (value: string, search: string, keywords?: string[]) => number | 自定义筛选函数。来自 CommandRootProps。 |
| shouldFilter | boolean | 是否启用内置筛选。来自 CommandRootProps。 |
CommandClassNames
Command 全部 slot 的 class 配置。
| 字段 | 类型 | 说明 |
|---|---|---|
| root | ClassValue | 根容器 class。 |
| inputWrapper | ClassValue | 输入框外层容器 class。 |
| inputIcon | ClassValue | 默认搜索图标 class。 |
| input | ClassValue | 输入框 class。 |
| list | ClassValue | 列表容器 class。 |
| empty | ClassValue | 空状态 class。 |
| group | ClassValue | 分组容器 class。 |
| groupLabel | ClassValue | 分组标题 class。 |
| item | ClassValue | 命令项 class。 |
| itemIcon | ClassValue | 命令项前置图标 class。 |
| separator | ClassValue | 分隔线 class。 |
| shortcut | ClassValue | 快捷键区域 class。 |
| dialog | ClassValue | Dialog 场景预留 slot。 |
CommandGroupOptionProps
分组选项数据。
| 字段 | 类型 | 说明 |
|---|---|---|
| type | 'group' | 显式声明为分组选项;包含 children 时可省略。 |
| label | ReactNode | 分组标题。 |
| children* | CommandOptionData[] | 分组内选项。 |
| className | ClassValue | 分组容器 class。 |
| classNames | Pick<CommandClassNames, 'group' | 'groupLabel'> | 分组相关 slot class。 |
CommandItemOptionProps
单个命令项数据。
| 字段 | 类型 | 说明 |
|---|---|---|
| type | 'item' | 显式声明为命令项;默认可省略。 |
| label | ReactNode | 命令项显示内容。 |
| value | string | cmdk 命令值。 |
| keywords | string[] | cmdk 搜索关键词。 |
| disabled | boolean | 禁用命令项。 |
| onSelect | (value: string) => void | 命令项被选择时触发。 |
| leading | ReactNode | 前置内容,常用于图标。 |
| trailing | ReactNode | 后置内容。 |
| shortcut | string | string[] | 快捷键展示。 |
| className | ClassValue | 命令项 class。 |
CommandSeparatorOptionProps
分隔线选项数据。
| 字段 | 类型 | 说明 |
|---|---|---|
| type* | 'separator' | 声明为分隔线。 |
| alwaysRender | boolean | cmdk 分隔线是否始终渲染。 |
| className | ClassValue | 分隔线 class。 |
CommandInputProps
搜索输入框属性。继承 cmdk CommandInput 属性,并增加前后插槽和 slot class。
| 字段 | 类型 | 说明 |
|---|---|---|
| placeholder | string | 占位文本。 |
| value | string | 受控输入值。 |
| onValueChange | (search: string) => void | 输入值变化回调。 |
| leading | ReactNode | 前置内容;默认显示搜索图标。 |
| trailing | ReactNode | 后置内容。 |
| className | ClassValue | 输入框 class。 |
| classNames | Pick<CommandClassNames, 'input' | 'inputIcon' | 'inputWrapper'> | 输入框相关 slot class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸。 |
CommandItemProps
命令项组件属性。继承 cmdk CommandItem 属性,并增加插槽和快捷键。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 命令项内容。 |
| value | string | cmdk 命令值。 |
| keywords | string[] | cmdk 搜索关键词。 |
| disabled | boolean | 禁用命令项。 |
| onSelect | (value: string) => void | 选择回调。 |
| leading | ReactNode | 前置内容。 |
| trailing | ReactNode | 后置内容。 |
| shortcut | string | string[] | 快捷键。 |
| className | ClassValue | 命令项 class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸。 |
CommandDialogProps
弹窗命令面板属性。打开状态来自 Dialog Root,内容属性透传给 DialogContent。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 弹窗内容。 |
| open | boolean | 受控打开状态。 |
| defaultOpen | boolean | 非受控默认打开状态。 |
| onOpenChange | (open: boolean) => void | 打开状态变化回调。 |
| title | ReactNode | 弹窗标题。 |
| description | ReactNode | 弹窗描述。 |
| className | ClassValue | 内容容器 class。 |
| classNames | CommandDialogClassNames | Dialog 相关 slot class。 |
| forceMount | true | 强制挂载内容容器。来自 DialogContent。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 内容容器尺寸。 |
CommandDialogClassNames
CommandDialog 可配置的 Dialog slot class。
| 字段 | 类型 | 说明 |
|---|---|---|
| overlay | ClassValue | 遮罩层 class。 |
| content | ClassValue | 内容容器 class。 |
| close | ClassValue | 关闭按钮 class。 |
| header | ClassValue | 头部 class。 |
| title | ClassValue | 标题 class。 |
| description | ClassValue | 描述 class。 |
CommandRootProps
cmdk 根容器属性。
| 字段 | 类型 | 说明 |
|---|---|---|
| className | ClassValue | 根容器 class。 |
| value | string | 受控搜索值。 |
| onValueChange | (value: string) => void | 搜索值变化回调。 |
| filter | (value: string, search: string, keywords?: string[]) => number | 自定义筛选函数。 |
| shouldFilter | boolean | 是否启用内置筛选。 |
| loop | boolean | 键盘导航是否循环。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸。 |
CommandListProps
命令列表容器属性。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 列表内容。 |
| className | ClassValue | 列表 class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸。 |
CommandEmptyProps
空状态属性。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 空状态内容。 |
| className | ClassValue | 空状态 class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸。 |
CommandGroupProps
分组组件属性。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 分组内容。 |
| heading | ReactNode | 分组标题。 |
| className | ClassValue | 分组容器 class。 |
| classNames | Pick<CommandClassNames, 'group' | 'groupLabel'> | 分组相关 slot class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸。 |
CommandSeparatorProps
分隔线组件属性。
| 字段 | 类型 | 说明 |
|---|---|---|
| className | ClassValue | 分隔线 class。 |
| alwaysRender | boolean | 是否始终渲染。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸。 |
CommandShortcutProps
快捷键展示组件属性。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 自定义快捷键内容。 |
| value | string | string[] | 快捷键值。 |
| className | ClassValue | 快捷键容器 class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸。 |
CommandOptionData
命令选项数据类型