vue filter实现搜索
Vue 过滤器实现搜索功能
在Vue中,过滤器可以用于格式化文本,但Vue 2.x之后官方推荐使用计算属性或方法替代过滤器。以下是几种实现搜索功能的方法:
使用计算属性实现搜索
计算属性是Vue中最常用的数据过滤方式,适合实现搜索功能:
<template>
<div>
<input v-model="searchQuery" placeholder="Search...">
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
]
}
},
computed: {
filteredItems() {
return this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
}
</script>
使用过滤器实现搜索(Vue 2.x)
虽然不推荐,但在Vue 2.x中仍可以使用过滤器:

<template>
<div>
<input v-model="searchQuery" placeholder="Search...">
<ul>
<li v-for="item in items | filterBy(searchQuery)" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
]
}
},
filters: {
filterBy(items, query) {
return items.filter(item =>
item.name.toLowerCase().includes(query.toLowerCase())
)
}
}
}
</script>
使用方法实现搜索
也可以使用方法来实现搜索功能:
<template>
<div>
<input v-model="searchQuery" placeholder="Search...">
<ul>
<li v-for="item in filterItems(searchQuery)" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
]
}
},
methods: {
filterItems(query) {
return this.items.filter(item =>
item.name.toLowerCase().includes(query.toLowerCase())
)
}
}
}
</script>
使用第三方库实现高级搜索
对于更复杂的搜索需求,可以使用lodash等库:

import _ from 'lodash'
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple', category: 'fruit' },
{ id: 2, name: 'Banana', category: 'fruit' },
{ id: 3, name: 'Carrot', category: 'vegetable' }
]
}
},
computed: {
filteredItems() {
return _.filter(this.items, item =>
_.includes(item.name.toLowerCase(), this.searchQuery.toLowerCase()) ||
_.includes(item.category.toLowerCase(), this.searchQuery.toLowerCase())
)
}
}
}
性能优化建议
对于大型数据集,考虑以下优化:
computed: {
filteredItems() {
const query = this.searchQuery.toLowerCase()
return this.items.filter(item =>
item.name.toLowerCase().includes(query)
)
}
}
避免在模板中直接调用方法进行过滤,因为每次渲染都会重新计算。计算属性会缓存结果,只有依赖项变化时才会重新计算。
多字段搜索实现
实现同时搜索多个字段的功能:
computed: {
filteredItems() {
const query = this.searchQuery.toLowerCase()
return this.items.filter(item =>
item.name.toLowerCase().includes(query) ||
item.description.toLowerCase().includes(query)
)
}
}






