跳到主要内容

CommandPalette 命令面板CommandPalette

一个搜索框加一份可以键盘操作的命令列表:让熟练用户不离开键盘就能跳转、执行操作。它是已有功能的捷径,不要把只能从这里进入的功能藏在里面。

基本用法

传一组 CommandItem。相同 group 的归到一组,组的顺序按首次出现。输入时按标签、说明、分组和 keywords 过滤(空格分隔的每个词都要命中)。快捷键只是展示,绑定由你自己做——这个示例绑了 ⌘K / Ctrl+K。

外部过滤、选中后不关闭

filter={false} 时组件不做过滤,结果完全由你按 query 给出(远程搜索就是这样接);也可以传一个函数自定义匹配。closeOnSelect={false} 让面板在选中后保持打开,适合连续多选。width 改宽度,placeholder / emptyText / label 改文案。

还没有添加成员

规格

外壳
FloatingCard · placement="top" · 不撑满 · 宽 560 · 圆角 24
位置
离顶边让出 10vh(最多 96px),窄屏贴顶
搜索行
高 56 · 左右内边距 20
列表
内边距 12 = 外圆角 24 − 列表项圆角 12;最高 520,超出原生滚动
高亮
中性浅灰底 · 键盘和指针共用同一个高亮

接口

CommandPalette

属性类型默认值说明
items*CommandItem[]—命令列表。
open / defaultOpenbooleanfalse开合,受控 / 非受控。快捷键由使用者自己绑。
onOpenChange(open: boolean) => void—开合变化时。
query / defaultQuerystring''搜索词,受控 / 非受控。每次打开会清空。
onQueryChange(query: string) => void—搜索词变化时。
filterfalse | ((item, query) => boolean)—自定义匹配;false 表示不在组件里过滤。
onSelect(item: CommandItem) => void—选中一项时(Enter 或点按)。item.onSelect 也会被调用。
closeOnSelectbooleantrue选中后是否关闭。
placeholderstring'搜索命令…'搜索框占位文字。
emptyTextReactNode'没有匹配的结果'没有结果时显示的内容。
labelstring'命令面板'面板和搜索框的读屏名称。
widthnumber | string560宽度。
footerReactNode—列表下面的一行提示(比如按键说明)。
dismissiblebooleantrue允许 Esc 和点遮罩关闭。

CommandItem

属性类型默认值说明
id*string—唯一标识。
label*string—命令名。
descriptionstring—标签右边的一句说明。
iconReactNode—图标。
shortcutstring[]—快捷键提示,一个键一项,如 ['⌘', 'S']。只是展示。
keywordsstring[]—额外的搜索关键词(拼音、英文别名…)。
groupstring—分组标题;相同的归到一组。
disabledboolean—禁用:显示但不能选,键盘移动时跳过。
onSelect() => void—选中时。

无障碍

  • 外壳是模态 dialog。搜索框是 role="combobox",结果是 listbox / option,分组是带名字的 group。
  • 焦点始终留在搜索框里,当前项通过 aria-activedescendant 告诉读屏,所以可以一边打字一边选。
  • ↑ ↓ 在结果里循环移动,Home End 到首尾,PageUp PageDown 一次跳五项;禁用的项会被跳过。
  • Enter 执行当前项,Esc 关闭;关闭后焦点回到打开前的元素。
  • 输入法正在组字时,方向键和回车归输入法,不会误触发命令(中文输入时很重要)。
  • 结果数量变化通过 aria-live 播报“N 条结果”;没有结果时读出空状态文字。
  • 快捷键提示对读屏隐藏(它们只是装饰性的提醒);真正的快捷键请写进各自功能的说明里。