vue实现input模糊搜索
实现思路
在Vue中实现input模糊搜索通常涉及监听输入框的变化,实时过滤数据列表并展示匹配结果。核心步骤包括数据绑定、输入事件处理和列表过滤。
基本实现代码示例
<template>
<div>
<input
v-model="searchQuery"
placeholder="输入关键词搜索"
@input="handleSearch"
/>
<ul v-if="filteredList.length">
<li v-for="item in filteredList" :key="item.id">
{{ item.name }}
</li>
</ul>
<p v-else>无匹配结果</p>
</div>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
originalList: [
{ id: 1, name: '苹果' },
{ id: 2, name: '香蕉' },
{ id: 3, name: '橙子' }
],
filteredList: []
}
},
methods: {
handleSearch() {
if (!this.searchQuery.trim()) {
this.filteredList = [...this.originalList];
return;
}
const query = this.searchQuery.toLowerCase();
this.filteredList = this.originalList.filter(item =>
item.name.toLowerCase().includes(query)
);
}
},
mounted() {
this.filteredList = [...this.originalList];
}
}
</script>
关键点说明
数据绑定
- 使用
v-model双向绑定输入框的值到searchQuery - 原始数据存储在
originalList中,过滤结果存储在filteredList
搜索逻辑
- 输入框触发
@input事件时执行handleSearch - 空搜索时显示全部数据
- 使用
toLowerCase()统一大小写避免大小写敏感问题 includes()方法实现基础模糊匹配
性能优化方案
防抖处理 避免频繁触发搜索逻辑,引入lodash的防抖函数:
import { debounce } from 'lodash';
methods: {
handleSearch: debounce(function() {
// 搜索逻辑
}, 300)
}
复杂匹配 需要更灵活的匹配时可以使用正则表达式:
this.filteredList = this.originalList.filter(item => {
const pattern = new RegExp(this.searchQuery, 'i');
return pattern.test(item.name);
});
服务端搜索实现
当数据量较大时,建议改为服务端搜索:
async handleSearch() {
const res = await axios.get('/api/search', {
params: { keyword: this.searchQuery }
});
this.filteredList = res.data;
}
样式增强建议
- 为搜索结果列表添加过渡动画
- 添加搜索中的loading状态
- 高亮显示匹配到的文本部分







