vue 搜索功能实现
实现 Vue 搜索功能的方法
1. 使用计算属性实现搜索
计算属性可以监听数据变化并返回过滤后的结果。在 Vue 组件中定义一个计算属性,根据搜索关键词过滤数组。
<template>
<div>
<input v-model="searchQuery" placeholder="Search..." />
<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>
2. 使用 watch 实现搜索
watch 可以监听搜索关键词的变化,并在变化时执行搜索逻辑。
<template>
<div>
<input v-model="searchQuery" placeholder="Search..." />
<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' }
],
filteredItems: []
}
},
watch: {
searchQuery(newVal) {
this.filteredItems = this.items.filter(item =>
item.name.toLowerCase().includes(newVal.toLowerCase())
)
}
},
created() {
this.filteredItems = this.items
}
}
</script>
3. 使用第三方库实现高级搜索
对于更复杂的搜索需求,可以使用第三方库如 Fuse.js 实现模糊搜索。
<template>
<div>
<input v-model="searchQuery" placeholder="Search..." />
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
import Fuse from 'fuse.js'
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
],
filteredItems: []
}
},
watch: {
searchQuery(newVal) {
const fuse = new Fuse(this.items, {
keys: ['name'],
threshold: 0.3
})
this.filteredItems = newVal ? fuse.search(newVal).map(r => r.item) : this.items
}
},
created() {
this.filteredItems = this.items
}
}
</script>
4. 使用 Vuex 实现全局搜索
如果搜索功能需要在多个组件中使用,可以将搜索逻辑放在 Vuex 中。
// store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
]
},
mutations: {
setSearchQuery(state, query) {
state.searchQuery = query
}
},
getters: {
filteredItems(state) {
return state.items.filter(item =>
item.name.toLowerCase().includes(state.searchQuery.toLowerCase())
)
}
}
})
// SearchComponent.vue
<template>
<div>
<input v-model="searchQuery" @input="updateSearchQuery" placeholder="Search..." />
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
import { mapGetters, mapMutations } from 'vuex'
export default {
computed: {
...mapGetters(['filteredItems']),
searchQuery: {
get() {
return this.$store.state.searchQuery
},
set(value) {
this.setSearchQuery(value)
}
}
},
methods: {
...mapMutations(['setSearchQuery']),
updateSearchQuery(e) {
this.setSearchQuery(e.target.value)
}
}
}
</script>
5. 使用 debounce 优化搜索性能
对于频繁触发的搜索输入,可以使用 debounce 来减少不必要的计算。
<template>
<div>
<input v-model="searchQuery" @input="debouncedSearch" placeholder="Search..." />
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
import _ from 'lodash'
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
],
filteredItems: []
}
},
created() {
this.debouncedSearch = _.debounce(this.search, 300)
this.filteredItems = this.items
},
methods: {
search() {
this.filteredItems = this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
}
</script>






