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: '苹果' },
{ id: 2, name: '香蕉' },
{ id: 3, name: '橙子' }
]
}
},
computed: {
filteredItems() {
return this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
}
</script>
基于方法的查询
对于需要更复杂查询逻辑或异步数据的情况,可以使用方法:
<template>
<div>
<input v-model="searchQuery" @input="searchItems" placeholder="搜索...">
<ul>
<li v-for="item in searchResults" :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: '橙子' }
],
searchResults: []
}
},
methods: {
searchItems() {
this.searchResults = this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
},
mounted() {
this.searchResults = [...this.items]
}
}
</script>
使用第三方库实现高级查询
对于更复杂的查询需求,可以集成第三方库如 Fuse.js:
<template>
<div>
<input v-model="searchQuery" placeholder="搜索...">
<ul>
<li v-for="item in searchResults" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
import Fuse from 'fuse.js'
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: '苹果' },
{ id: 2, name: '香蕉' },
{ id: 3, name: '橙子' }
],
fuse: null,
searchResults: []
}
},
created() {
this.fuse = new Fuse(this.items, {
keys: ['name'],
threshold: 0.4
})
this.searchResults = [...this.items]
},
watch: {
searchQuery(newVal) {
if (!newVal.trim()) {
this.searchResults = [...this.items]
return
}
this.searchResults = this.fuse.search(newVal).map(result => result.item)
}
}
}
</script>
异步数据查询
当数据来自API时,可以使用防抖技术优化性能:
<template>
<div>
<input v-model="searchQuery" placeholder="搜索...">
<ul v-if="!loading">
<li v-for="item in searchResults" :key="item.id">
{{ item.name }}
</li>
</ul>
<div v-else>加载中...</div>
</div>
</template>
<script>
let debounceTimer
export default {
data() {
return {
searchQuery: '',
searchResults: [],
loading: false
}
},
watch: {
searchQuery(newVal) {
clearTimeout(debounceTimer)
debounceTimer = setTimeout(() => {
this.fetchSearchResults(newVal)
}, 300)
}
},
methods: {
async fetchSearchResults(query) {
if (!query.trim()) {
this.searchResults = []
return
}
this.loading = true
try {
const response = await fetch(`/api/items?q=${query}`)
this.searchResults = await response.json()
} catch (error) {
console.error('搜索失败:', error)
} finally {
this.loading = false
}
}
}
}
</script>
多字段查询
支持在多个字段中进行搜索:
computed: {
filteredItems() {
const query = this.searchQuery.toLowerCase()
return this.items.filter(item =>
item.name.toLowerCase().includes(query) ||
item.description.toLowerCase().includes(query)
)
}
}
以上方法可以根据具体需求选择或组合使用,计算属性适合简单场景,方法调用适合需要更多控制的场景,第三方库适合复杂模糊搜索,异步查询适合API数据。







