vue 实现查询
Vue 实现查询功能
在 Vue 中实现查询功能通常涉及数据绑定、事件处理和列表过滤。以下是几种常见的实现方式:
使用计算属性过滤列表
通过计算属性动态过滤数据列表,适合静态数据或少量数据的场景。

<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: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
]
}
},
computed: {
filteredItems() {
return this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
}
</script>
使用 watch 监听查询变化
当需要异步获取数据时,可以使用 watch 监听查询变化并触发 API 请求。
<script>
export default {
data() {
return {
searchQuery: '',
items: [],
timeout: null
}
},
watch: {
searchQuery(newVal) {
clearTimeout(this.timeout)
this.timeout = setTimeout(() => {
this.fetchItems(newVal)
}, 300)
}
},
methods: {
async fetchItems(query) {
const response = await axios.get('/api/items', { params: { q: query } })
this.items = response.data
}
}
}
</script>
使用第三方库实现高级搜索
对于复杂搜索需求,可以集成如 Fuse.js 这类模糊搜索库:

import Fuse from 'fuse.js'
export default {
data() {
return {
fuse: null,
searchQuery: '',
allItems: [...],
searchResults: []
}
},
mounted() {
this.fuse = new Fuse(this.allItems, {
keys: ['name', 'description'],
threshold: 0.4
})
},
watch: {
searchQuery(val) {
this.searchResults = val ? this.fuse.search(val) : this.allItems
}
}
}
结合 Vuex 管理搜索状态
在大型应用中,可以使用 Vuex 集中管理搜索状态:
// store.js
export default new Vuex.Store({
state: {
searchQuery: '',
items: []
},
mutations: {
SET_SEARCH_QUERY(state, query) {
state.searchQuery = query
},
SET_ITEMS(state, items) {
state.items = items
}
},
actions: {
async searchItems({ commit }, query) {
const response = await api.search(query)
commit('SET_ITEMS', response.data)
}
}
})
性能优化技巧
对于大数据量列表,可以考虑以下优化:
- 添加防抖(debounce)减少频繁搜索
- 使用虚拟滚动只渲染可见项
- 后端分页处理大量数据
- 缓存搜索结果减少重复请求
import { debounce } from 'lodash'
export default {
methods: {
search: debounce(function(query) {
// 执行搜索
}, 300)
}
}
根据具体需求选择适合的实现方式,简单场景使用计算属性即可,复杂场景可能需要结合多种技术方案。






