vue实现筛选搜索框
Vue 实现筛选搜索框
数据绑定与输入处理
在 Vue 中实现筛选搜索框,首先需要绑定输入框的数据到组件的状态。使用 v-model 可以实现双向绑定,监听用户输入。
<template>
<div>
<input
v-model="searchQuery"
placeholder="输入关键词筛选"
/>
</div>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: '苹果' },
{ id: 2, name: '香蕉' },
{ id: 3, name: '橙子' }
]
};
}
};
</script>
计算属性实现筛选逻辑
通过计算属性动态过滤数据,避免直接在模板中写复杂逻辑。计算属性会根据依赖的响应式数据自动更新。
<script>
export default {
computed: {
filteredItems() {
return this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
);
}
}
};
</script>
渲染筛选结果
将计算属性返回的筛选结果渲染到页面,通常结合 v-for 指令实现列表展示。
<template>
<div>
<input
v-model="searchQuery"
placeholder="输入关键词筛选"
/>
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
优化性能与用户体验
对于大数据量或复杂筛选逻辑,可以加入防抖(debounce)减少频繁计算。使用 Lodash 的 _.debounce 或自定义实现。
methods: {
debouncedSearch: _.debounce(function() {
this.filteredItems = this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
);
}, 300)
},
watch: {
searchQuery() {
this.debouncedSearch();
}
}
多条件筛选扩展
若需支持多字段筛选,可以扩展计算属性逻辑,结合多个条件判断。
computed: {
filteredItems() {
return this.items.filter(item => {
const matchesName = item.name.toLowerCase().includes(this.searchQuery.toLowerCase());
const matchesCategory = item.category.toLowerCase().includes(this.categoryQuery.toLowerCase());
return matchesName && matchesCategory;
});
}
}
样式与交互增强
通过 CSS 美化搜索框和筛选结果,例如添加加载状态、无结果提示等,提升用户体验。
<template>
<div class="search-container">
<input
v-model="searchQuery"
class="search-input"
placeholder="输入关键词筛选"
/>
<div v-if="filteredItems.length === 0" class="no-results">
无匹配结果
</div>
<ul class="results-list">
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
<style>
.search-input {
padding: 8px;
width: 100%;
border: 1px solid #ccc;
}
.no-results {
color: #999;
padding: 10px;
}
</style>
服务端筛选集成
对于大数据量,可将筛选逻辑移至服务端,通过 API 请求获取结果。使用 axios 或 fetch 发送请求。

methods: {
async fetchFilteredItems() {
const response = await axios.get('/api/items', {
params: { search: this.searchQuery }
});
this.filteredItems = response.data;
}
},
watch: {
searchQuery() {
this.fetchFilteredItems();
}
}
以上方法涵盖了从基础到进阶的 Vue 筛选搜索框实现,可根据实际需求选择或组合使用。






