基于Vue實現(xiàn)關鍵詞實時搜索高亮顯示關鍵詞
最近在做移動real-time-search于實時搜索和關鍵詞高亮顯示的功能,通過博客的方式總結(jié)一下,同時希望能夠幫助到別人~~~
如果不喜歡看文字的朋友我寫了一個demo方便已經(jīng)上傳到了github上,可以clone下來直接看代碼 https://github.com/IT0315/real-time-search.git
下面是demo運行的效果圖

好了閑話不多說直接上代碼
實時搜索
實時搜索通過觸發(fā)input事件和定時器來實現(xiàn)
<input v-model="keyWords" type="text" placeholder="請輸入關鍵詞" @input="handleQuery">
在每次輸入框的值變化的時候都會執(zhí)行handleQuery方法
clearTimer () {
if (this.timer) {
clearTimeout(this.timer)
}
},
handleQuery (event) {
this.clearTimer()
console.log(event.timeStamp)
this.timer = setTimeout(() => {
console.log(event.timeStamp)
// console.log(this.lastTime)
// if (this.lastTime - event.timeStamp === 0) {
this.$http.post('/api/vehicle').then(res => {
console.log(res.data.data)
this.changeColor(res.data.data)
})
// }
}, 2000)
},
在handleQuery方法中有一個定時器,通過設置時間來控制搜索的執(zhí)行,由于輸入時input的框中的值總是變化的,所以每次變化都會執(zhí)行一次handleQuery,我們通過clearTimer方法清除timer定時器,如果兩次輸入的間隔時間小于你設置的時間間隔(2s)的話第一個定期器將會被清除,同時執(zhí)行第二個定時器。這樣就實現(xiàn)了實施搜多的控制,而不是每次輸入的時候就去請求數(shù)據(jù)。
注意:如果時間設置過短或者說我們服務器請求較慢的話,可能第一次查詢還沒有返回便進行了第二次查詢,那么返回的數(shù)據(jù)將是兩次查詢的結(jié)果,造成查詢結(jié)果的混亂,如果使用的是axios可以利用axios.CancelToken來終止上一次的異步請求,防止舊關鍵字查詢覆蓋新輸入的關鍵字查詢結(jié)果。
高亮顯示
通過RegExp實現(xiàn)對關鍵詞的替換,通過添加class實現(xiàn)關鍵詞高亮顯示
changeColor (resultsList) {
resultsList.map((item, index) => {
// console.log('item', item)
if (this.keyWords && this.keyWords.length > 0) {
// 匹配關鍵字正則
let replaceReg = new RegExp(this.keyWords, 'g')
// 高亮替換v-html值
let replaceString =
'<span class="search-text">' + this.keyWords + '</span>'
resultsList[index].name = item.name.replace(
replaceReg,
replaceString
)
}
})
this.results = []
this.results = resultsList
}
在查詢到結(jié)果后執(zhí)行changeColor方法將查詢出來的數(shù)據(jù)傳遞過來通過RegExp來將關鍵詞替換成huml標簽,同時用vue中的v-html進行綁定。最后將demo完整的代碼展示出來
<template>
<div class="Home">
<input v-model="keyWords" type="text" placeholder="請輸入關鍵詞" @input="handleQuery">
<ul>
<li v-for="(item,index) in results" :key='index' v-html='item.name'></li>
</ul>
</div>
</template>
<script>
export default {
name: 'Home',
data () {
return {
keyWords: '',
results: []
}
},
methods: {
clearTimer () {
if (this.timer) {
clearTimeout(this.timer)
}
},
handleQuery (event) {
this.clearTimer()
console.log(event.timeStamp)
this.timer = setTimeout(() => {
console.log(event.timeStamp)
// console.log(this.lastTime)
// if (this.lastTime - event.timeStamp === 0) {
this.$http.post('/api/vehicle').then(res => {
console.log(res.data.data)
this.changeColor(res.data.data)
})
// }
}, 2000)
},
changeColor (resultsList) {
resultsList.map((item, index) => {
// console.log('item', item)
if (this.keyWords && this.keyWords.length > 0) {
// 匹配關鍵字正則
let replaceReg = new RegExp(this.keyWords, 'g')
// 高亮替換v-html值
let replaceString =
'<span class="search-text">' + this.keyWords + '</span>'
resultsList[index].name = item.name.replace(
replaceReg,
replaceString
)
}
})
this.results = []
this.results = resultsList
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style>
.search-text{
color: red;
}
</style>
最后,如果本文對你的學習或者工作有幫助的話,麻煩給個star鼓勵下啦~~~
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
vue報錯Failed to execute 'appendChild&apos
這篇文章主要為大家介紹了vue報錯Failed to execute 'appendChild' on 'Node'解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
vue-cli5.0?webpack?采用?copy-webpack-plugin?打包復制文件的方法
今天就好好說說vue-cli5.0種使用copy-webpack-plugin插件該如何配置的問題。這里我們安裝的 copy-webpack-plugin 的版本是 ^11.0.0,感興趣的朋友一起看看吧2022-06-06
IDEA創(chuàng)建Vue項目的兩種方式總結(jié)
這篇文章主要介紹了IDEA創(chuàng)建Vue項目的兩種方式總結(jié),具有很好的參考價值,希望對大家有所幫助。2023-04-04

