vue 搜索框功能实现
实现 Vue 搜索框功能
在 Vue 中实现搜索框功能通常涉及数据绑定、事件监听和过滤逻辑。以下是具体实现方法:
基础实现(基于本地数据)
-
模板部分
使用v-model绑定搜索输入框的值,监听输入事件触发搜索:<template> <div> <input type="text" v-model="searchQuery" placeholder="搜索..." @input="handleSearch" /> <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()) ) } }, methods: { handleSearch() { // 可在此处添加防抖逻辑 } } } </script>
高级优化方案
防抖处理
避免频繁触发搜索逻辑,使用 Lodash 的 debounce 或手动实现:
<script>
import { debounce } from 'lodash';
export default {
methods: {
handleSearch: debounce(function() {
// 搜索逻辑
}, 500)
}
}
</script>
异步搜索(API 请求)
结合 Axios 实现远程搜索:
<script>
import axios from 'axios';
export default {
methods: {
async handleSearch() {
try {
const response = await axios.get('/api/search', {
params: { q: this.searchQuery }
})
this.filteredItems = response.data
} catch (error) {
console.error(error)
}
}
}
}
</script>
样式与交互增强
-
添加加载状态
在异步搜索时显示加载指示器:<template> <div> <input v-model="searchQuery" @input="handleSearch" /> <span v-if="isLoading">加载中...</span> </div> </template> -
键盘事件支持
监听回车键触发搜索:<input @keyup.enter="handleSearch" />
完整组件示例
<template>
<div class="search-container">
<input
v-model="searchQuery"
@input="handleSearch"
@keyup.enter="handleSearch"
placeholder="输入关键词"
/>
<div v-if="isLoading" class="loading">搜索中...</div>
<ul v-else>
<li v-for="result in results" :key="result.id">
{{ result.text }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
results: [],
isLoading: false
}
},
methods: {
async handleSearch() {
if (this.searchQuery.trim() === '') {
this.results = []
return
}
this.isLoading = true
try {
const response = await fetch(`/api/search?q=${encodeURIComponent(this.searchQuery)}`)
this.results = await response.json()
} catch (error) {
console.error('搜索失败:', error)
} finally {
this.isLoading = false
}
}
}
}
</script>
<style>
.search-container {
max-width: 600px;
margin: 0 auto;
}
.loading {
color: #666;
padding: 10px;
}
</style>
通过以上方法,可以灵活实现不同复杂度的搜索功能,适用于本地数据过滤或远程 API 搜索场景。







