vue实现筛选列表
Vue 实现筛选列表的方法
在 Vue 中实现筛选列表可以通过多种方式完成,以下是几种常见的方法:
使用计算属性筛选数据
计算属性是 Vue 中处理数据筛选的理想选择,它会根据依赖的数据自动更新:
<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: '苹果' },
{ id: 2, name: '香蕉' },
{ id: 3, name: '橙子' }
]
}
},
computed: {
filteredItems() {
return this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
}
</script>
使用方法进行筛选
如果需要更复杂的筛选逻辑,可以使用方法:
<template>
<div>
<input v-model="searchQuery" @input="filterItems">
<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: '苹果' },
{ id: 2, name: '香蕉' },
{ id: 3, name: '橙子' }
],
filteredItems: []
}
},
methods: {
filterItems() {
this.filteredItems = this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
},
created() {
this.filterItems()
}
}
</script>
使用第三方库实现高级筛选
对于更复杂的筛选需求,可以考虑使用 Lodash 等工具库:
import _ from 'lodash'
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: '苹果', category: '水果' },
{ id: 2, name: '胡萝卜', category: '蔬菜' }
]
}
},
computed: {
filteredItems() {
return _.filter(this.items, item => {
return (
item.name.toLowerCase().includes(this.searchQuery.toLowerCase()) ||
item.category.toLowerCase().includes(this.searchQuery.toLowerCase())
)
})
}
}
}
多条件筛选实现
实现多条件筛选可以结合多个输入框和计算属性:
<template>
<div>
<input v-model="nameFilter" placeholder="按名称筛选">
<input v-model="categoryFilter" placeholder="按类别筛选">
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }} - {{ item.category }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
nameFilter: '',
categoryFilter: '',
items: [
{ id: 1, name: '苹果', category: '水果' },
{ id: 2, name: '胡萝卜', category: '蔬菜' }
]
}
},
computed: {
filteredItems() {
return this.items.filter(item => {
const nameMatch = item.name.toLowerCase().includes(this.nameFilter.toLowerCase())
const categoryMatch = item.category.toLowerCase().includes(this.categoryFilter.toLowerCase())
return nameMatch && categoryMatch
})
}
}
}
</script>
使用 Vuex 管理筛选状态
在大型应用中,可以使用 Vuex 集中管理筛选状态:
// store.js
export default new Vuex.Store({
state: {
searchQuery: '',
items: [
{ id: 1, name: '苹果' },
{ id: 2, name: '香蕉' }
]
},
getters: {
filteredItems: state => {
return state.items.filter(item =>
item.name.toLowerCase().includes(state.searchQuery.toLowerCase())
)
}
}
})
// 组件中使用
<template>
<div>
<input v-model="$store.state.searchQuery">
<ul>
<li v-for="item in $store.getters.filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
以上方法可以根据具体需求选择使用,计算属性方式适合大多数简单场景,而 Vuex 方式更适合状态管理复杂的大型应用。







