Skip to content

自动补全

@astryxdesign/core v0.7.1 · Typeahead

使用方法 ​

Typeahead 是单选搜索框。输入框是 combobox,下拉列表是 listbox。本地数据用 createStaticSource,远程数据自己实现 search。

本地搜索按标签和可选关键词做子串匹配。debounceMs 设为 0 会立刻过滤:

vue
<script setup lang="ts">
import { createStaticSource } from '@astryx-vue/core'
import { Typeahead } from '@astryx-vue/core/Typeahead'
import { ref } from 'vue'

const selected = ref(null)
const source = createStaticSource([
  { id: 'apple', label: '苹果' },
  { id: 'grape', label: '葡萄' },
], { keywords: item => item.id === 'grape' ? ['提子'] : [] })
</script>

<template>
  <Typeahead v-model="selected" :search-source="source" label="水果" :debounce-ms="0" show-on-focus />
</template>

异步数据源返回 Promise。useAsyncSource 会在输入停顿后发起请求,默认等待 150 毫秒。新的一次搜索会取消上一次,过期结果不会写回列表。空查询优先走 bootstrap。加载、没有结果、请求失败分别显示加载文案、空状态和错误文案。

方向键移动高亮项,Enter 选中,Escape 关闭列表。焦点在输入框里时,Home 和 End 移动光标。选中后结果收成一枚可聚焦的标签,再次聚焦会回到搜索。

内置文案默认是英文。调用 provideAstryxLocale('zh-CN') 后改为中文。文档页会按当前语言自动提供。

解剖

部分说明
字段提供标签和可选辅助内容的独立 Field 外壳。放在 InputGroup 里时不画这一层。
输入表面装着可编辑输入或已选标签的着色控件表面。
图标渲染的起始图标可选的前导语义图标或图标组件,通过 Icon 绘制。
使用方渲染的起始内容直接画在输入表面开头的可选任意插槽内容。
已选标签控件不在编辑状态时,用来呈现已选项的 Token。
转圈搜索进行中时,输入表面末尾的加载指示。
清除按钮共用的清除操作。clearable 打开时去掉已选项。
下拉装着当前搜索结果的锚定列表框表面。
空状态一次搜索完成但没有结果时的消息。
结果行稳定的选项外层,负责高亮、选中、指针和键盘行为。
默认项内容没有提供 item 插槽时,结果行里画出的标准标签和辅助内容。
使用方渲染的项内容通过 item 插槽放进稳定结果行里的、由使用方拥有的结果内容。
结果分组标题一组带标签的结果行的可见标题。
已选结果状态当前结果行上的选中样式,以及尾部的勾。

最佳实践 ​

指引实践
推荐本地数据把 debounceMs 设为 0,远程请求保留默认防抖。
推荐远程源在 signal 被取消时中止请求,避免过期结果覆盖新结果。
避免用自动补全做多选。多选固定列表用多选器,多选搜索用标签输入框。

示例 ​

限制结果

下拉最多显示三条结果。

搜索框

带搜索图标,聚焦后就给出建议。

辅助说明

Select the department this request should be routed to

标签下面有一段说明。

校验

Please select an office location

用错误状态提示必须选择一个地点。

无字段外壳

BaseTypeahead 没有字段标签和说明。命令面板这类已经有自己标题的地方用它,输入框的无障碍名用 label 传入。