vue 实现过滤
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>
使用方法进行过滤
如果过滤逻辑需要参数或更复杂,可以使用方法:

<template>
<div>
<input v-model="searchQuery" placeholder="Search...">
<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>
使用 Vue 过滤器
Vue 提供了过滤器功能,虽然 Vue 3 中已不再推荐使用,但在 Vue 2 中仍然可用:
<template>
<div>
<input v-model="searchQuery" placeholder="Search...">
<ul>
<li v-for="item in items | filterBy(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' }
]
}
},
filters: {
filterBy(list, query) {
return list.filter(item =>
item.name.toLowerCase().includes(query.toLowerCase())
)
}
}
}
</script>
使用第三方库
对于更复杂的过滤需求,可以考虑使用 lodash 等工具库:

import _ from 'lodash'
export default {
computed: {
filteredItems() {
return _.filter(this.items, item =>
_.includes(item.name.toLowerCase(), this.searchQuery.toLowerCase())
)
}
}
}
组合式 API 实现
在 Vue 3 中,可以使用组合式 API 实现更灵活的过滤:
<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 { computed, ref } from 'vue'
export default {
setup() {
const searchQuery = ref('')
const items = ref([
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
])
const filteredItems = computed(() => {
return items.value.filter(item =>
item.name.toLowerCase().includes(searchQuery.value.toLowerCase())
)
})
return { searchQuery, filteredItems }
}
}
</script>
性能优化建议
对于大型数据集,可以考虑以下优化措施:
- 使用防抖处理输入事件,减少频繁过滤
- 对数据进行预排序或建立索引
- 考虑分页加载而不是一次性过滤所有数据
- 使用 Web Worker 处理耗时的过滤操作






