vue实现简单搜索
Vue 实现简单搜索功能
数据绑定与输入框
在 Vue 中实现搜索功能,通常使用 v-model 绑定输入框的值到数据属性。创建一个输入框用于用户输入搜索关键词:
<template>
<input v-model="searchQuery" placeholder="输入搜索关键词">
</template>
<script>
export default {
data() {
return {
searchQuery: ''
}
}
}
</script>
过滤数据列表
假设有一个数据列表需要根据搜索关键词过滤,可以使用计算属性实现实时过滤:

<template>
<input v-model="searchQuery" placeholder="输入搜索关键词">
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</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>
添加搜索按钮
如果需要点击按钮触发搜索而不是实时过滤,可以使用方法替代计算属性:

<template>
<input v-model="searchQuery" placeholder="输入搜索关键词">
<button @click="search">搜索</button>
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
],
filteredItems: []
}
},
methods: {
search() {
this.filteredItems = this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
}
</script>
使用 Lodash 防抖
对于实时搜索,可以使用 Lodash 的防抖函数减少频繁触发:
<template>
<input v-model="searchQuery" placeholder="输入搜索关键词">
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</template>
<script>
import { debounce } from 'lodash'
export default {
data() {
return {
searchQuery: '',
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
],
filteredItems: []
}
},
watch: {
searchQuery: debounce(function(newVal) {
this.filteredItems = this.items.filter(item =>
item.name.toLowerCase().includes(newVal.toLowerCase())
)
}, 300)
}
}
</script>
搜索高亮显示
可以使用自定义指令或方法实现搜索关键词高亮:
<template>
<input v-model="searchQuery" placeholder="输入搜索关键词">
<ul>
<li v-for="item in filteredItems" :key="item.id" v-html="highlight(item.name)">
</li>
</ul>
</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())
)
}
},
methods: {
highlight(text) {
if (!this.searchQuery) return text
const regex = new RegExp(this.searchQuery, 'gi')
return text.replace(regex, match => `<span style="background-color: yellow">${match}</span>`)
}
}
}
</script>






