vue中实现搜索查询
实现搜索查询的基本思路
在Vue中实现搜索查询功能通常需要结合数据绑定、事件监听和过滤逻辑。核心是通过v-model绑定输入框,利用计算属性或方法对数据进行过滤。
基础实现方法
创建输入框并绑定到Vue实例的data属性:
<input v-model="searchQuery" placeholder="搜索...">
在Vue实例中定义数据和计算属性:
data() {
return {
searchQuery: '',
items: [
{ name: '苹果', category: '水果' },
{ name: '香蕉', category: '水果' },
{ name: '胡萝卜', category: '蔬菜' }
]
}
},
computed: {
filteredItems() {
return this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
多字段搜索
扩展过滤逻辑以支持多个字段搜索:
computed: {
filteredItems() {
const query = this.searchQuery.toLowerCase()
return this.items.filter(item =>
item.name.toLowerCase().includes(query) ||
item.category.toLowerCase().includes(query)
)
}
}
使用watch实现异步搜索
当需要从API异步获取搜索结果时:
data() {
return {
searchQuery: '',
searchResults: [],
timeout: null
}
},
watch: {
searchQuery(newVal) {
clearTimeout(this.timeout)
this.timeout = setTimeout(() => {
this.fetchResults(newVal)
}, 300)
}
},
methods: {
fetchResults(query) {
axios.get(`/api/search?q=${query}`)
.then(response => {
this.searchResults = response.data
})
}
}
使用第三方库实现高级搜索
对于更复杂的搜索需求,可以考虑使用Fuse.js等模糊搜索库:
安装Fuse.js:
npm install fuse.js
在组件中使用:
import Fuse from 'fuse.js'
export default {
data() {
return {
searchQuery: '',
items: [...],
fuse: null
}
},
created() {
this.fuse = new Fuse(this.items, {
keys: ['name', 'category'],
threshold: 0.4
})
},
computed: {
filteredItems() {
return this.searchQuery
? this.fuse.search(this.searchQuery).map(r => r.item)
: this.items
}
}
}
性能优化技巧
对于大型数据集,考虑以下优化:
- 使用debounce减少频繁搜索请求
- 对搜索结果进行分页加载
- 在Web Worker中执行耗时搜索操作
- 使用虚拟滚动渲染大量结果
methods: {
debouncedSearch: _.debounce(function(query) {
this.fetchResults(query)
}, 500)
}
添加搜索建议
实现自动完成功能:
<input v-model="searchQuery" @input="getSuggestions">
<ul v-if="suggestions.length">
<li v-for="suggestion in suggestions" @click="selectSuggestion(suggestion)">
{{ suggestion }}
</li>
</ul>
methods: {
getSuggestions() {
if(this.searchQuery.length > 2) {
this.suggestions = this.items
.filter(item => item.name.startsWith(this.searchQuery))
.map(item => item.name)
}
},
selectSuggestion(suggestion) {
this.searchQuery = suggestion
this.suggestions = []
}
}






