Skip to content

Autocomplete 自动补全输入框

Autocomplete 根据输入内容提供对应的输入建议。VISTA B 直接使用 Element Plus 的 el-autocomplete,适合用于搜索框、表单字段和需要快速选择历史项的输入场景。

基础用法

通过 fetch-suggestions 返回建议列表。方法会收到当前输入值 queryString 和回调函数 cb,通过 cb(data) 将建议数据传回组件。默认会读取建议对象中的 value 字段作为展示文本。

list suggestions when activated
list suggestions on input
selected: 未选择
vue
<script setup>
import { ref } from 'vue'

const state = ref('')
const suggestions = [
  { value: 'vue', link: 'https://github.com/vuejs/vue' },
  { value: 'element', link: 'https://github.com/element-plus/element-plus' }
]

const querySearch = (queryString, cb) => {
  const results = queryString
    ? suggestions.filter((item) => item.value.startsWith(queryString))
    : suggestions
  cb(results)
}
</script>

<template>
  <el-autocomplete
    v-model="state"
    :fetch-suggestions="querySearch"
    clearable
    placeholder="Please Input"
  />
</template>

自定义模板

使用默认插槽可以自定义建议项内容。插槽参数中的 item 是当前建议对象。

vue
<el-autocomplete
  v-model="state"
  :fetch-suggestions="querySearch"
  popper-class="my-autocomplete"
  placeholder="Please input"
>
  <template #suffix>
    <el-icon class="el-input__icon">
      <Edit />
    </el-icon>
  </template>
  <template #default="{ item }">
    <div>{{ item.value }}</div>
    <span>{{ item.link }}</span>
  </template>
</el-autocomplete>

远程搜索

fetch-suggestions 可以异步返回数据,适用于从服务端搜索建议。配合 debounce 可以控制请求防抖时间。

vue
<script setup>
import { ref } from 'vue'

const state = ref('')
let timeout

const querySearchAsync = (queryString, cb) => {
  clearTimeout(timeout)
  timeout = setTimeout(() => {
    cb([{ value: queryString || 'vue' }])
  }, 800)
}
</script>

<template>
  <el-autocomplete
    v-model="state"
    :fetch-suggestions="querySearchAsync"
    placeholder="Please input"
  />
</template>

自定义加载

通过 loading 插槽可以替换远程搜索时的加载内容。

vue
<el-autocomplete
  v-model="state"
  :fetch-suggestions="querySearchAsync"
  placeholder="Please input"
>
  <template #loading>
    <el-icon class="is-loading">
      <Loading />
    </el-icon>
  </template>
</el-autocomplete>

自定义头部与底部

使用 headerfooter 插槽可以在建议列表顶部或底部添加自定义内容。

Custom header content
Custom footer content
vue
<el-autocomplete
  ref="autocompleteRef"
  v-model="state"
  :fetch-suggestions="querySearchAsync"
>
  <template #header>header content</template>
  <template #footer>
    <el-button link size="small" @click="state = ''">Clear</el-button>
  </template>
</el-autocomplete>

API

Autocomplete 属性

属性说明类型默认值
model-value / v-model选中项绑定值string
placeholder占位文本string
clearable是否可清空booleanfalse
disabled是否禁用booleanfalse
value-key输入建议对象中用于显示的键名stringvalue
debounce获取输入建议的防抖延时,单位为毫秒number300
placement菜单弹出位置top / top-start / top-end / bottom / bottom-start / bottom-endbottom-start
fetch-suggestions获取输入建议的方法或数组;函数模式需要通过 callback(data) 返回结果array / function
trigger-on-focus输入框获取焦点时是否显示建议booleantrue
select-when-unmatched输入没有任何匹配建议时,按下回车是否触发 select 事件booleanfalse
name原生 input 的 name 属性string
aria-label原生 aria-label 属性string
hide-loading是否隐藏远程加载时的加载图标booleanfalse
popper-class下拉列表的类名string / object
popper-style下拉列表的样式string / object
popper-optionsPopper.js 参数object{}
show-arrow下拉菜单是否显示箭头booleantrue
teleported是否将下拉列表插入 append-to 指向的元素下booleantrue
append-to下拉框挂载到哪个 DOM 元素CSSSelector / HTMLElement
highlight-first-item是否默认高亮远程搜索结果的第一项booleanfalse
fit-input-width下拉框宽度是否与输入框相同booleanfalse
loop-navigation键盘导航是否从末尾循环到开头booleantrue

Autocomplete 事件

事件名说明类型
blur输入框失去焦点时触发(event: FocusEvent) => void
focus输入框获得焦点时触发(event: FocusEvent) => void
input输入值改变时触发(value: string) => void
clear点击清空按钮时触发() => void
select点击选中建议项时触发(item: object) => void
change输入值改变且失焦后触发(value: string) => void

Autocomplete 插槽

插槽说明
default自定义输入建议内容,作用域参数为 { item }
header下拉列表顶部内容
footer下拉列表底部内容
prefix输入框头部内容
suffix输入框尾部内容
prepend输入框前置内容,在 prefix 之前
append输入框后置内容,在 suffix 之后
loading自定义加载区域内容

Autocomplete 方法

方法名说明类型
focus使 input 获取焦点() => void
blur使 input 失去焦点() => void
close折叠建议列表() => void
highlight在建议中高亮显示一个项目(index: number) => void
getData加载建议列表() => void
handleSelect手动触发选中建议事件(item: object) => void
handleKeyEnter手动触发键盘回车事件() => void

使用提醒

建议项默认需要包含 value 字段;如果后端字段名不同,可以通过 value-key 指定展示字段。远程搜索时建议搭配 debounce,避免每次输入都立即请求。需要只在输入后展示建议时,将 trigger-on-focus 设置为 false

HOMEVISTA 设计规范