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>
使用 watch 实现异步搜索
当搜索需要调用 API 或处理复杂逻辑时,可以使用 watch 配合防抖函数。
<template>
<div>
<input v-model="searchQuery" placeholder="搜索...">
<ul v-if="results.length">
<li v-for="result in results" :key="result.id">
{{ result.title }}
</li>
</ul>
<p v-else>没有搜索结果</p>
</div>
</template>
<script>
import _ from 'lodash'
export default {
data() {
return {
searchQuery: '',
results: []
}
},
watch: {
searchQuery: _.debounce(function(newVal) {
if (newVal.length < 3) return
this.fetchResults(newVal)
}, 500)
},
methods: {
async fetchResults(query) {
const response = await fetch(`https://api.example.com/search?q=${query}`)
this.results = await response.json()
}
}
}
</script>
使用 Vuex 管理搜索状态
对于大型应用,可以使用 Vuex 集中管理搜索状态和逻辑。
// store.js
export default new Vuex.Store({
state: {
searchQuery: '',
searchResults: []
},
mutations: {
SET_SEARCH_QUERY(state, query) {
state.searchQuery = query
},
SET_SEARCH_RESULTS(state, results) {
state.searchResults = results
}
},
actions: {
async search({ commit }, query) {
commit('SET_SEARCH_QUERY', query)
const response = await fetch(`https://api.example.com/search?q=${query}`)
const results = await response.json()
commit('SET_SEARCH_RESULTS', results)
}
}
})
// SearchComponent.vue
<template>
<div>
<input
v-model="searchQuery"
@input="onSearchInput"
placeholder="搜索..."
>
<ul>
<li v-for="result in searchResults" :key="result.id">
{{ result.title }}
</li>
</ul>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex'
export default {
computed: {
...mapState(['searchResults']),
searchQuery: {
get() {
return this.$store.state.searchQuery
},
set(value) {
this.$store.commit('SET_SEARCH_QUERY', value)
}
}
},
methods: {
...mapActions(['search']),
onSearchInput() {
this.search(this.searchQuery)
}
}
}
</script>
使用第三方库实现高级搜索
对于更复杂的需求,可以考虑使用专门的搜索库如 Fuse.js。
<template>
<div>
<input v-model="searchQuery" placeholder="搜索...">
<ul>
<li v-for="result in searchResults" :key="result.item.id">
{{ result.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
}
},
created() {
this.fuse = new Fuse(this.items, {
keys: ['name'],
includeScore: true
})
},
computed: {
searchResults() {
if (!this.searchQuery) return []
return this.fuse.search(this.searchQuery)
}
}
}
</script>
搜索功能优化建议
实现基本的搜索功能后,可以考虑以下优化点:
- 添加加载状态指示器
- 实现搜索历史记录
- 添加搜索建议/自动完成
- 优化移动端体验
- 考虑使用 Web Worker 处理大量数据搜索
以上方法可以根据具体项目需求选择或组合使用,计算属性适合简单场景,watch 适合异步操作,Vuex 适合状态管理,第三方库提供更专业的搜索能力。







