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: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Orange' }
]
}
},
computed: {
filteredItems() {
return this.items.filter(item =>
item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
}
</script>
使用第三方库实现更复杂匹配
对于需要更高级模糊匹配的场景,可以使用Fuse.js等专业库:
import Fuse from 'fuse.js'
export default {
data() {
return {
fuse: null,
searchQuery: '',
items: [...] // 原始数据
}
},
created() {
this.fuse = new Fuse(this.items, {
keys: ['name', 'description'],
threshold: 0.4
})
},
computed: {
filteredItems() {
return this.searchQuery
? this.fuse.search(this.searchQuery).map(r => r.item)
: this.items
}
}
}
使用自定义指令实现搜索高亮
为搜索结果添加高亮效果可以提升用户体验:

Vue.directive('highlight', {
inserted(el, binding) {
const text = el.textContent
const query = binding.value
if (!query) return
const regex = new RegExp(query, 'gi')
el.innerHTML = text.replace(regex, match =>
`<span class="highlight">${match}</span>`
)
}
})
结合防抖优化性能
频繁触发搜索时建议添加防抖功能:
import { debounce } from 'lodash'
export default {
methods: {
handleSearch: debounce(function(query) {
// 搜索逻辑
}, 300)
}
}
服务器端模糊搜索实现
当数据量较大时,应考虑后端实现搜索:
methods: {
async searchItems(query) {
const response = await axios.get('/api/search', {
params: { q: query }
})
this.filteredItems = response.data
}
}
以上方法可根据具体需求选择或组合使用,计算属性方案适合简单场景,Fuse.js适合复杂模糊匹配,服务器端搜索适合大数据量情况。






