跳到主要内容

Combobox 组合框Combobox · Autocomplete

选项很多、用户大概知道自己要什么时,让他们边打字边筛选:国家、成员、仓库。Combobox 的值必须是选项之一;Autocomplete 允许任意输入,选项只是建议。选项不多时直接用 Select。

基本用法

点击或打字都会展开列表;刚展开、还没改过文字时显示全部选项。没选就离开,文字会回到当前选中项。

分组、图标与清除

选项的写法和 Select 相同(分组、禁用、图标、meta)。clearable 在有内容时显示清除按钮;icon 是输入框前面的图标。

尺寸与状态

受控用法

有两份状态:value 是选中项的值,inputValue 是输入框里的文字。把文字清空会把 value 置为 null。

value:jp · 输入框文字:“日本”

异步加载

选项来自接口时:监听 onInputChange 去请求,把 filter 设为 false(不在本地再筛一遍),请求期间传 loading。emptyText 传 null 可以在没有内容时干脆不弹出。

已选仓库:无

Autocomplete 自动补全

可以任意输入,选项只是建议:值就是输入框里的文字。适合邮箱后缀、标签、搜索历史这类“多半是这些,但也可能是别的”的输入。

可以选一个常用的,也可以自己输入

API

Combobox

属性类型默认值说明
options*Array<SelectOption | { label: string; options: SelectOption[] }>—选项;可以混入分组。SelectOption 的字段见 Select。
valuestring | null—选中项的 value(受控);null 表示没选。Autocomplete 时就是输入框里的文字。
defaultValuestring | nullnull初始选中项(非受控)。
onChange(value: string | null, option?: SelectOption) => void—选中项变化时触发;清空时为 null。
inputValuestring—输入框里的文字(受控)。
defaultInputValuestring—输入框的初始文字,默认取选中项的文字。
onInputChange(text: string) => void—文字变化时触发(打字、选中、清除)。
filter((option, query) => boolean) | false按文字包含(不分大小写)自定义筛选;false 表示不在本地筛选。
loadingbooleanfalse正在加载选项:列表上方显示加载文字,输入框带 aria-busy。
loadingTextReactNode'加载中…'加载时显示的内容。
emptyTextReactNode'没有匹配的选项'没有匹配项时显示的内容;传 null 则不弹出。
freeSolobooleanfalse允许任意输入。Autocomplete 就是固定开启它的 Combobox。
clearablebooleanfalse有内容时显示清除按钮。
iconIconName | ReactNode—输入框前面的图标。
size'sm' | 'md' | 'lg''md'尺寸。
invalid / disabled / requiredboolean—校验未通过 / 禁用 / 必填。放在 Field 里时没传就取 Field 的。
name / formstring—配合表单提交:Combobox 提交选中项的 value,Autocomplete 提交输入的文字。
open / defaultOpen / onOpenChangeboolean / boolean / (open) => void—列表的展开状态。
placementPlacement'bottom-start'列表相对输入框的位置。
refRef<HTMLInputElement>—指向里面的原生 <input>(和 Input、SearchInput 一致),可以直接 focus() / select()。
rootRefRef<HTMLDivElement>—外框(.ok-input)的 ref,需要量尺寸或以它为锚点时用。
rootClassName / rootStylestring / CSSProperties—外框的类名与样式;className / style 也落在外框上。
…restInputHTMLAttributes—其余原生属性(id、placeholder、aria-*)落在 <input> 上。

无障碍

  • 输入框是 role="combobox",aria-autocomplete="list";列表是 role="listbox"。焦点始终在输入框里,高亮项通过 aria-activedescendant 告诉读屏。
  • ↓ / ↑ 展开并在选项间移动(跳过禁用项);Enter 选中高亮项;Esc 收起列表;Tab 收起并离开。
  • 打字时自动高亮第一个匹配项,所以“打几个字 + Enter”就能选中;异步搜索的结果回来后同样会高亮第一项。
  • “加载中”和“没有匹配的选项”是 role="status",会被播报;加载期间输入框带 aria-busy。
  • 清除按钮不在 Tab 顺序里:键盘用户全选后删除即可,效果相同。
  • 必须有可读名称:aria-label,或直接放进带 label 的 Field——id、aria-describedby、aria-invalid、required、disabled 会自动接上。