vue实现自动筛选
自动筛选实现方法
在Vue中实现自动筛选功能,可以通过计算属性、v-model指令和数组过滤方法结合完成。以下是具体实现方式:
基础实现

<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" placeholder="搜索名称或描述..." />
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }} - {{ item.description }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: '苹果', description: '红色水果' },
{ id: 2, name: '香蕉', description: '黄色水果' },
{ id: 3, name: '橙子', description: '橙色水果' }
]
}
},
computed: {
filteredItems() {
const query = this.searchQuery.toLowerCase()
return this.items.filter(item =>
item.name.toLowerCase().includes(query) ||
item.description.toLowerCase().includes(query)
)
}
}
}
</script>
高级筛选功能
使用debounce优化性能

<script>
import { debounce } from 'lodash'
export default {
data() {
return {
searchQuery: '',
items: [...],
filteredItems: []
}
},
watch: {
searchQuery: debounce(function(newVal) {
this.filterItems(newVal)
}, 300)
},
methods: {
filterItems(query) {
const q = query.toLowerCase()
this.filteredItems = this.items.filter(item =>
item.name.toLowerCase().includes(q)
)
}
}
}
</script>
结合Vuex实现
// store.js
const store = new Vuex.Store({
state: {
items: [...],
searchQuery: ''
},
getters: {
filteredItems: state => {
return state.items.filter(item =>
item.name.toLowerCase().includes(state.searchQuery.toLowerCase())
)
}
}
})
// 组件中使用
computed: {
...mapGetters(['filteredItems']),
searchQuery: {
get() {
return this.$store.state.searchQuery
},
set(value) {
this.$store.commit('UPDATE_SEARCH_QUERY', value)
}
}
}
筛选组件封装
可复用筛选组件
<template>
<div class="filter-container">
<slot name="input" :query="query" :updateQuery="updateQuery">
<input
:value="query"
@input="updateQuery($event.target.value)"
placeholder="搜索..."
/>
</slot>
<slot name="results" :filteredItems="filteredItems">
<ul>
<li v-for="item in filteredItems" :key="getKey(item)">
{{ item }}
</li>
</ul>
</slot>
</div>
</template>
<script>
export default {
props: {
items: {
type: Array,
required: true
},
filterFn: {
type: Function,
default: (item, query) =>
item.toString().toLowerCase().includes(query.toLowerCase())
},
getKey: {
type: Function,
default: (item, index) => index
}
},
data() {
return {
query: ''
}
},
computed: {
filteredItems() {
return this.items.filter(item =>
this.filterFn(item, this.query)
)
}
},
methods: {
updateQuery(query) {
this.query = query
}
}
}
</script>
这些方法涵盖了从基础到高级的自动筛选实现,可以根据项目需求选择合适的方案。组件化封装使得筛选功能可以在不同场景下复用,而Vuex集成则适合大型应用的状态管理需求。






