vue filter实现搜索
Vue 过滤器实现搜索功能
在 Vue 中,过滤器(Filters)通常用于文本格式化,但结合计算属性或方法可以实现搜索功能。以下是几种实现方式:
使用计算属性实现搜索
计算属性适合基于现有数据动态计算新值的情况,例如搜索过滤:
<template>
<input v-model="searchQuery" placeholder="Search...">
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Cherry' }
]
}
},
computed: {
filteredItems() {
return this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
}
</script>
使用方法实现搜索
方法可以在需要时调用,适合更复杂的搜索逻辑:
<template>
<input v-model="searchQuery" @input="filterItems">
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Cherry' }
],
filteredItems: []
}
},
methods: {
filterItems() {
this.filteredItems = this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
},
mounted() {
this.filterItems()
}
}
</script>
使用自定义过滤器实现搜索
虽然 Vue 3 已移除过滤器,但在 Vue 2 中可以这样使用:
<template>
<input v-model="searchQuery">
<ul>
<li v-for="item in items | filterBy(searchQuery)" :key="item.id">
{{ item.name }}
</li>
</ul>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Cherry' }
]
}
},
filters: {
filterBy(value, query) {
if (!query) return value
return value.filter(item =>
item.name.toLowerCase().includes(query.toLowerCase())
)
}
}
}
</script>
使用第三方库实现高级搜索
对于更复杂的搜索需求,可以考虑使用第三方库如 Fuse.js:
import Fuse from 'fuse.js'
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Cherry' }
],
fuse: null
}
},
computed: {
filteredItems() {
if (!this.searchQuery) return this.items
return this.fuse.search(this.searchQuery).map(result => result.item)
}
},
mounted() {
this.fuse = new Fuse(this.items, {
keys: ['name'],
threshold: 0.4
})
}
}
性能优化建议
对于大型数据集,考虑以下优化:
- 使用防抖(debounce)减少频繁搜索带来的性能问题
- 使用 Web Worker 在后台线程执行搜索
- 对数据进行分页处理,减少每次搜索的数据量
- 使用虚拟滚动(如 vue-virtual-scroller)优化渲染性能







