Skip to content

自动补全

@astryxdesign/core v0.7.1 · Typeahead

Typeahead Props ​

名称类型默认值说明
modelValueT | nullnull当前选中的条目。条目至少包含 id 和 label。
searchSourceSearchSource<T>必需静态或异步搜索源。空查询优先调用 bootstrap。
labelstring必需字段标签。屏幕阅读器始终读得到。
descriptionstring—标签下方的说明。
labelTooltipstring—标签旁边信息图标里的提示文字。
isLabelHiddenbooleanfalse视觉上隐藏标签,读屏仍然读得到。旧名 labelHidden 同样可用,两者任一为真就隐藏。
containerClass / controlClassclass—外壳和输入外框。根上的 class 落在外框,不落到原生 input。候选项的 action 把菜单变成两列,点操作不会选中这一项。
startIconComponent—输入框起始侧的图标。已有 icon 插槽时以插槽为准。
placeholderstringSearch… / 搜索…占位符。未设置语言时为英文。
debounceMsnumber150输入停顿后再搜索。本地数据可设为 0。
minQueryLengthnumber1够长才去搜索的下限,按人眼看到的字符数算。太短就完全不搜,下拉也不打开,免得为一个没搜过的查询显示「没有结果」。空查询不算太短,照旧走 bootstrap。
hasEntriesOnFocusbooleanfalse聚焦后还没输入就展示 bootstrap 结果。
showOnFocusbooleanfalsehasEntriesOnFocus 的旧名。两者任一为真即生效。
hasAutoFocusbooleanfalse挂载后自动聚焦输入框。
maxMenuItemsnumber10下拉最多显示多少条。
hasClearbooleantrue是否显示清除按钮,用来取消当前选中值。
clearablebooleantruehasClear 的旧名。任一为假就不显示按钮。
emptySearchTextstring | null'No results found' / '未找到结果'没有匹配结果时显示的文字。null 当作没给,退回默认;空字符串表示什么都不显示。要放链接这类富内容用 empty 插槽。
emptyTextstring | null—emptySearchText 的旧名。
disabledbooleanfalse是否禁用。
disabledMessagestring—说明为什么被禁用。和 disabled 一起用时,控件改用 aria-disabled 加 readonly,因此仍然可聚焦,鼠标悬停或键盘聚焦都能读到这段说明。
disabledReasonstring—disabledMessage 的旧名。
status'default' | 'success' | 'warning' | 'error''default'状态样式。
statusMessagestring—字段下方的状态说明。
size'sm' | 'md' | 'lg''md'输入框和标签的尺寸。
requiredbooleanfalse标记为必填。
optionalbooleanfalse标签上显示「可选」标记。
namestring—表单字段名。提交选中条目的 id。
widthnumber | string—整个字段的宽度(数字按像素算,字符串原样使用)。

Typeahead Emits ​

名称载荷说明
update:modelValuevalue: T | null选中或清除时触发。
changevalue: T | null选中或清除时触发。
changeQueryquery: string查询文字变化时触发。
searchquery: stringchangeQuery 的旧名。两个都会触发。
openChangeisOpen: boolean列表打开或关闭时触发。

Typeahead Slots ​

名称参数说明
icon—输入框开头的图标。
item{ item, isActive, isSelected }自定义下拉条目,替换默认的 TypeaheadItem。
empty—自定义空状态。

createStaticSource ​

名称类型说明
itemsT[]本地条目。
keywords(item: T) => string[]除 label 之外还参与子串匹配的词。

结果分组 ​

把分组名放在 item.auxiliaryData.group 上。同名的条目会渲染成一个 role="group" 区块,前面带可见的标题,顺序按分组第一次出现的先后。没有分组名的条目留在原位。

ts
const items = [
  { id: 'apple', label: 'Apple', auxiliaryData: { group: 'Fruit' } },
  { id: 'carrot', label: 'Carrot', auxiliaryData: { group: 'Vegetable' } },
]

BaseTypeahead ​

没有字段标签、说明和校验文案。适合命令面板这类外面已经有标题的地方。label 在这里是输入框的无障碍名,外面已经有 <label for> 时不用传。默认下拉行是 TypeaheadItem,可以用 item 插槽换掉。

名称类型默认值说明
modelValueT | nullnull当前选中的条目。
searchSourceSearchSource<T>必需静态或异步搜索源。
labelstring—输入框的无障碍名。
inputIdstring自动生成输入框的 id,好让外面的标签用 for 对上。
describedBystring—外面已经算好的说明和状态 id。
ariaDescribedBystring—输入框专用的 aria-describedby 别名,给了就盖过原生属性。
ariaLabelledBystring—输入框专用的 aria-labelledby 别名,给了就盖过原生属性。
anchorRefHTMLElement | null—下拉挂靠并据此量宽度的元素。不传就用输入框所在的外框。
inputTabIndexnumber—输入框在 Tab 序里的位置。选中值的标签盖住输入框时默认取 -1,免得留下看不见的停留点。
isFocusableDisabledbooleanfalse让禁用的输入框改用 aria-disabled 加 readonly,仍然可聚焦,好让调用方给的禁用说明读得到。输入内容照样被挡住。
hasAutoFocusbooleanfalse挂载后自动聚焦输入框。
hasEntriesOnFocusbooleanfalse聚焦后还没输入就展示 bootstrap 结果。
showOnFocusbooleanfalsehasEntriesOnFocus 的旧名。两者任一为真即生效。
minQueryLengthnumber1够长才去搜索的下限,按人眼看到的字符数算。太短就完全不搜,下拉也不打开。
menuWidthnumber—下拉想要的宽度,单位像素。窄不过锚点,再宽会被视口截住。
maxMenuItemsnumber10下拉最多显示多少条。
emptySearchTextstring | null'No results found' / '未找到结果'没有匹配结果时显示的文字。null 退回默认,空字符串什么都不显示。
emptyTextstring | null—emptySearchText 的旧名。
placeholderstringSearch…输入框占位符。
disabledbooleanfalse是否禁用。
disabledReasonstring—禁用原因。鼠标悬停会显示提示,同时作为说明被读出来,输入框仍可聚焦。
status'default' | 'success' | 'warning' | 'error''default'外框的校验色。
size'sm' | 'md' | 'lg''md'输入框和标签的尺寸。
clearablebooleantrue是否显示清除按钮。
debounceMsnumber150输入停顿后再搜索。本地数据可设为 0。
requiredbooleanfalse标记为必填。
namestring—表单字段名。提交选中条目的 id。
名称载荷说明
update:modelValuevalue: T | null选中或清除时触发。
changevalue: T | null选中或清除时触发。
changeQueryquery: string查询文字变化时触发。
searchquery: stringchangeQuery 的旧名。两个都会触发。
openChangeisOpen: boolean列表打开或关闭时触发。

上面没列出的原生属性和事件监听会落到输入框上,所以 @keydown、@focus、@blur 和 aria-* 的用法跟普通 <input> 一样。keydown 监听先于内部键盘导航执行,调用 event.preventDefault() 就能跳过内部处理。

TypeaheadItem ​

名称类型默认值说明
itemSearchableItem必需这一行对应的搜索结果。
descriptionstring—盖过条目自己的说明。
groupstring—为了和同名属性对得上而接受;这一行自己不会画标题。分组由下拉按 item.auxiliaryData.group 完成。
isDisabledbooleanfalse这一行看起来不可选。
icon(插槽)——标签前面的图标或头像。