vue实现搜索过滤
Vue 实现搜索过滤的方法
在 Vue 中实现搜索过滤功能通常需要结合 v-model 和计算属性(computed)或方法(methods)来动态过滤数据。以下是几种常见的实现方式:
使用计算属性过滤数据
计算属性适合处理响应式数据的变化,自动更新过滤结果。
<template>
<div>
<input v-model="searchQuery" placeholder="搜索...">
<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>
使用方法过滤数据
如果过滤逻辑较复杂或需要传递参数,可以使用方法。
<template>
<div>
<input v-model="searchQuery" placeholder="搜索...">
<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 的防抖优化搜索
频繁触发搜索时,可以使用 Lodash 的 debounce 函数减少性能开销。
<template>
<div>
<input v-model="searchQuery" placeholder="搜索...">
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
import _ from 'lodash'
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
]
}
},
computed: {
filteredItems() {
return this.debouncedFilter()
}
},
methods: {
debouncedFilter: _.debounce(function() {
return this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}, 300)
}
}
</script>
结合 Vuex 实现全局搜索
如果数据存储在 Vuex 中,可以通过 mapGetters 或 mapActions 实现搜索过滤。
<template>
<div>
<input v-model="searchQuery" placeholder="搜索...">
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
export default {
data() {
return {
searchQuery: ''
}
},
computed: {
...mapGetters(['getItems']),
filteredItems() {
return this.getItems.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
}
</script>
使用第三方库实现高级搜索
对于更复杂的搜索需求,可以使用 Fuse.js 等模糊搜索库。
<template>
<div>
<input v-model="searchQuery" placeholder="搜索...">
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
import Fuse from 'fuse.js'
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
],
fuse: null
}
},
created() {
this.fuse = new Fuse(this.items, {
keys: ['name'],
threshold: 0.3
})
},
computed: {
filteredItems() {
if (!this.searchQuery) return this.items
return this.fuse.search(this.searchQuery).map(result => result.item)
}
}
}
</script>
总结
Vue 实现搜索过滤的核心在于结合 v-model 和计算属性或方法动态过滤数据。根据需求可以选择简单的手动过滤、防抖优化、Vuex 集成或第三方库支持。以上方法覆盖了大多数常见场景,可根据实际需求灵活调整。







