vue实现筛选功能
Vue 实现筛选功能的方法
基于计算属性的筛选
通过计算属性动态过滤数据,适用于静态或少量数据筛选。示例代码:
<template>
<input v-model="searchQuery" placeholder="筛选关键词">
<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' }
]
}
},
computed: {
filteredItems() {
return this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
}
</script>
使用自定义筛选方法
对于复杂筛选逻辑,可以定义独立方法处理。示例:
methods: {
filterItems() {
return this.items.filter(item => {
const matchesSearch = item.name.includes(this.searchQuery)
const matchesCategory = this.selectedCategory
? item.category === this.selectedCategory
: true
return matchesSearch && matchesCategory
})
}
}
结合 Vuex 的状态管理
当筛选涉及全局状态时,使用 Vuex 管理筛选条件和结果:
// store.js
state: {
products: [],
filters: {
priceRange: [0, 100],
category: null
}
},
getters: {
filteredProducts: (state) => {
return state.products.filter(product => {
const inPriceRange = product.price >= state.filters.priceRange[0]
&& product.price <= state.filters.priceRange[1]
const matchesCategory = state.filters.category
? product.category === state.filters.category
: true
return inPriceRange && matchesCategory
})
}
}
第三方库辅助筛选
对于大型数据集,考虑使用 lodash 的 _.filter 或 _.debounce 优化性能:
import { debounce } from 'lodash'
export default {
methods: {
handleSearch: debounce(function() {
this.filteredData = this.data.filter(item =>
item.name.includes(this.searchTerm)
)
}, 300)
}
}
服务器端筛选
当数据量极大时,应通过 API 实现后端筛选:

async fetchFilteredData() {
const params = {
search: this.searchQuery,
category: this.activeCategory
}
const response = await axios.get('/api/items', { params })
this.filteredItems = response.data
}
注意事项
- 对于中文搜索需注意大小写转换:
toLocaleLowerCase() - 复杂筛选条件建议拆分为多个计算属性
- 列表渲染时始终使用
:key提升性能 - 大数据量考虑虚拟滚动技术避免DOM过多






