vue实现搜索页面
Vue 实现搜索页面
数据绑定与输入处理
在 Vue 中,使用 v-model 实现输入框与数据的双向绑定。创建一个 searchQuery 变量来存储用户输入的内容。
<template>
<div>
<input
type="text"
v-model="searchQuery"
placeholder="输入搜索内容"
@keyup.enter="handleSearch"
/>
<button @click="handleSearch">搜索</button>
</div>
</template>
<script>
export default {
data() {
return {
searchQuery: ''
}
},
methods: {
handleSearch() {
this.$emit('search', this.searchQuery)
}
}
}
</script>
搜索结果展示
根据搜索条件过滤数据,使用 computed 属性动态计算搜索结果。假设有一个 items 数组作为数据源。
<template>
<div>
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
export default {
props: ['items', 'searchQuery'],
computed: {
filteredItems() {
return this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
}
</script>
集成搜索功能
将输入组件和结果展示组件组合,通过事件传递搜索关键词。
<template>
<div>
<SearchInput @search="updateSearchQuery" />
<SearchResults :items="items" :searchQuery="currentQuery" />
</div>
</template>
<script>
import SearchInput from './SearchInput.vue'
import SearchResults from './SearchResults.vue'
export default {
components: { SearchInput, SearchResults },
data() {
return {
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
],
currentQuery: ''
}
},
methods: {
updateSearchQuery(query) {
this.currentQuery = query
}
}
}
</script>
优化搜索性能
对于大数据量场景,使用防抖(debounce)减少频繁搜索带来的性能损耗。
<script>
import _ from 'lodash'
export default {
methods: {
handleSearch: _.debounce(function() {
this.$emit('search', this.searchQuery)
}, 500)
}
}
</script>
高亮匹配内容
在搜索结果中高亮显示匹配的关键词,使用自定义过滤器或方法。
<template>
<div v-html="highlight(item.name, searchQuery)"></div>
</template>
<script>
export default {
methods: {
highlight(text, query) {
if (!query) return text
const regex = new RegExp(query, 'gi')
return text.replace(regex, match => `<span class="highlight">${match}</span>`)
}
}
}
</script>
<style>
.highlight {
background-color: yellow;
}
</style>
路由集成
结合 Vue Router 实现 URL 同步,便于分享或刷新页面后保留搜索状态。
// 在路由配置中添加查询参数
{
path: '/search',
name: 'Search',
component: SearchPage,
props: route => ({ query: route.query.q || '' })
}
// 在搜索方法中更新路由
this.$router.push({
path: '/search',
query: { q: this.searchQuery }
})






