实现思路
使用 Vuetify 中的 v-menu
组件实现,控制光标焦点,在输入框获取的焦点时弹出联想词汇菜单,支持上下按键选中内容,菜单位置,样式按需调整即可
数据获取方面通过监听输入框内容变化,调用对应接口获取数据
注意
如果产品功能要求极高的性能,要加防抖和节流处理
<template>
<div v-on:keyup.enter="search">
<v-menu offset-y>
<template v-slot:activator="{ on }">
<v-text-field
solo
hide-details
label="请输入关键词"
append-icon="search"
v-model="text"
class="input-search"
autocomplete="off"
v-on="on"
ref="search"
></v-text-field>
</template>
<v-list v-if="items.length > 0" class="border-list" dense>
<v-list-item v-for="(item, index) in items" :key="index" @click="itemClick(item)">
<v-list-item-title>{{ item.name }}</v-list-item-title>
</v-list-item>
</v-list>
</v-menu>
</div>
</template>
<script>
export default {
data () {
return {
text: '',
showSelect: true,
items: []
}
},
watch: {
text: 'inputHandle'
},
methods: {
itemClick (item) {
this.text = item.name
this.$refs.search.blur()
// this.$router.push()
},
inputHandle (text) {
if (text.trim() !== '') {
this.showSelect = true
setTimeout(() => {
this.getEntity()
}, 300)
}
},
getEntity () {
// 请求接口更新 items 数据
this.items = [
{
key: '1234',
name: '1234'
},
{
key: 'abc',
name: 'abc'
},
{
key: 'def',
name: 'def'
},
{
key: 'ccc',
name: 'ccc'
},
{
key: 'ccc',
name: 'ccc'
},
{
key: 'ccc',
name: 'ccc'
}
]
},
search () {
this.$refs.search.blur()
console.log(this.text)
// this.$router.push()
}
}
}
</script>
<style scoped>
.input-search {
width: 40%;
margin: auto;
}
.width-20-percent {
width: 20%;
}
.img-div {
margin: 16vh 0 40px 0;
text-align: center;
}
.v-menu__content {
box-shadow: none !important;
}
.border-list {
border: 1px solid #eee !important;
}
</style>