vue实现搜索过滤
Vue 实现搜索过滤
使用计算属性实现搜索过滤
在 Vue 中,计算属性(computed)是实现搜索过滤的常见方法。通过计算属性动态过滤数据,无需修改原始数据。
<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>
使用方法实现搜索过滤
如果需要在特定事件触发时过滤数据,可以使用方法(methods)实现搜索功能。
<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: []
}
},
created() {
this.filteredItems = this.items
},
methods: {
filterItems() {
this.filteredItems = this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
}
</script>
使用第三方库实现高级搜索
对于更复杂的搜索需求,可以借助第三方库如 lodash 的 debounce 函数优化性能。
<template>
<div>
<input v-model="searchQuery" @input="debouncedFilter">
<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: '苹果' },
{ id: 2, name: '香蕉' },
{ id: 3, name: '橙子' }
],
filteredItems: []
}
},
created() {
this.filteredItems = this.items
this.debouncedFilter = debounce(this.filterItems, 300)
},
methods: {
filterItems() {
this.filteredItems = this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
}
</script>
多条件搜索过滤
如果需要根据多个条件进行搜索,可以扩展过滤逻辑。
<template>
<div>
<input v-model="searchQuery" placeholder="名称搜索">
<input v-model="categoryQuery" placeholder="分类搜索">
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }} - {{ item.category }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
categoryQuery: '',
items: [
{ id: 1, name: '苹果', category: '水果' },
{ id: 2, name: '香蕉', category: '水果' },
{ id: 3, name: '胡萝卜', category: '蔬菜' }
]
}
},
computed: {
filteredItems() {
return this.items.filter(item => {
const nameMatch = item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
const categoryMatch = item.category.toLowerCase().includes(this.categoryQuery.toLowerCase())
return nameMatch && categoryMatch
})
}
}
}
</script>
服务器端搜索过滤
对于大量数据,建议将搜索逻辑放在服务器端,通过 API 请求获取过滤后的数据。
<template>
<div>
<input v-model="searchQuery" @input="fetchFilteredItems">
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
filteredItems: []
}
},
methods: {
async fetchFilteredItems() {
try {
const response = await axios.get('/api/items', {
params: { search: this.searchQuery }
})
this.filteredItems = response.data
} catch (error) {
console.error('搜索失败:', error)
}
}
}
}
</script>






