vue实现列表模糊检索
实现思路
在Vue中实现列表模糊检索通常涉及以下几个关键点:利用计算属性动态过滤列表、绑定输入框的输入事件、使用正则表达式或字符串方法进行模糊匹配。
基础实现步骤
创建Vue实例或组件,定义数据列表和搜索关键词的响应式变量。
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
]
}
}
使用计算属性实现过滤逻辑,通过filter方法结合字符串匹配。
computed: {
filteredItems() {
const query = this.searchQuery.toLowerCase()
return this.items.filter(item =>
item.name.toLowerCase().includes(query)
)
}
}
在模板中绑定输入框和渲染过滤后的列表。
<input v-model="searchQuery" placeholder="Search...">
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
高级匹配方式
如需实现更复杂的模糊搜索(如部分字符匹配),可使用正则表达式。
computed: {
filteredItems() {
const query = this.searchQuery
if (!query) return this.items
const pattern = new RegExp(query.split('').join('.*'), 'i')
return this.items.filter(item => pattern.test(item.name))
}
}
多字段搜索
当需要同时搜索多个字段时,扩展过滤逻辑。
computed: {
filteredItems() {
const query = this.searchQuery.toLowerCase()
return this.items.filter(item =>
item.name.toLowerCase().includes(query) ||
item.description.toLowerCase().includes(query)
)
}
}
性能优化
对于大型列表,考虑以下优化措施:
- 使用
debounce减少输入频繁触发搜索的频率 - 对数据进行预处理(如预先转换为小写)
- 使用Web Worker处理复杂计算
import { debounce } from 'lodash'
methods: {
handleSearch: debounce(function(query) {
this.searchQuery = query
}, 300)
}
第三方库方案
考虑使用专门的模糊搜索库如Fuse.js实现更强大的搜索功能。
import Fuse from 'fuse.js'
// 在created钩子中初始化
created() {
this.fuse = new Fuse(this.items, {
keys: ['name', 'description'],
threshold: 0.4
})
}
// 计算属性调整
computed: {
filteredItems() {
return this.searchQuery
? this.fuse.search(this.searchQuery).map(r => r.item)
: this.items
}
}






