vue实现搜索筛选
Vue 实现搜索筛选功能
在 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>
使用 watch 实现搜索筛选
当需要更复杂的逻辑或在搜索时执行异步操作时,可以使用 watch。
<script>
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
],
filteredItems: []
}
},
watch: {
searchQuery(newVal) {
this.filteredItems = this.items.filter(item =>
item.name.toLowerCase().includes(newVal.toLowerCase())
)
}
},
created() {
this.filteredItems = this.items
}
}
</script>
使用第三方库实现高级搜索
对于更复杂的搜索需求,可以使用 lodash 的 debounce 函数来优化性能。
<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>
import { debounce } from 'lodash'
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
],
filteredItems: []
}
},
created() {
this.debouncedFilter = debounce(this.filterItems, 300)
this.filteredItems = this.items
},
watch: {
searchQuery() {
this.debouncedFilter()
}
},
methods: {
filterItems() {
this.filteredItems = this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
}
</script>
结合 Vuex 实现全局搜索
在大型应用中,可以使用 Vuex 来管理搜索状态。
// store.js
export default new Vuex.Store({
state: {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
]
},
getters: {
filteredItems: state => {
return state.items.filter(item =>
item.name.toLowerCase().includes(state.searchQuery.toLowerCase())
)
}
},
mutations: {
setSearchQuery(state, query) {
state.searchQuery = query
}
}
})
// Component.vue
<template>
<div>
<input
:value="searchQuery"
@input="updateSearchQuery($event.target.value)"
placeholder="Search..."
>
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
import { mapGetters, mapMutations } from 'vuex'
export default {
computed: {
...mapGetters(['filteredItems']),
searchQuery() {
return this.$store.state.searchQuery
}
},
methods: {
...mapMutations(['setSearchQuery']),
updateSearchQuery(query) {
this.setSearchQuery(query)
}
}
}
</script>
实现多条件筛选
对于需要多个筛选条件的场景,可以扩展筛选逻辑。
<template>
<div>
<input v-model="searchQuery" placeholder="Search by name...">
<select v-model="selectedCategory">
<option value="">All Categories</option>
<option value="fruit">Fruit</option>
<option value="vegetable">Vegetable</option>
</select>
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }} ({{ item.category }})
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
selectedCategory: '',
items: [
{ id: 1, name: 'Apple', category: 'fruit' },
{ id: 2, name: 'Banana', category: 'fruit' },
{ id: 3, name: 'Carrot', category: 'vegetable' }
]
}
},
computed: {
filteredItems() {
return this.items.filter(item => {
const matchesSearch = item.name.toLowerCase()
.includes(this.searchQuery.toLowerCase())
const matchesCategory = !this.selectedCategory ||
item.category === this.selectedCategory
return matchesSearch && matchesCategory
})
}
}
}
</script>
以上方法涵盖了 Vue 中实现搜索筛选的基本到高级场景,可以根据具体需求选择合适的方式。







