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

好了閑話不多說(shuō)直接上代碼
實(shí)時(shí)搜索
實(shí)時(shí)搜索通過(guò)觸發(fā)input事件和定時(shí)器來(lái)實(shí)現(xiàn)
<input v-model="keyWords" type="text" placeholder="請(qǐng)輸入關(guān)鍵詞" @input="handleQuery">
在每次輸入框的值變化的時(shí)候都會(huì)執(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方法中有一個(gè)定時(shí)器,通過(guò)設(shè)置時(shí)間來(lái)控制搜索的執(zhí)行,由于輸入時(shí)input的框中的值總是變化的,所以每次變化都會(huì)執(zhí)行一次handleQuery,我們通過(guò)clearTimer方法清除timer定時(shí)器,如果兩次輸入的間隔時(shí)間小于你設(shè)置的時(shí)間間隔(2s)的話第一個(gè)定期器將會(huì)被清除,同時(shí)執(zhí)行第二個(gè)定時(shí)器。這樣就實(shí)現(xiàn)了實(shí)施搜多的控制,而不是每次輸入的時(shí)候就去請(qǐng)求數(shù)據(jù)。
注意:如果時(shí)間設(shè)置過(guò)短或者說(shuō)我們服務(wù)器請(qǐng)求較慢的話,可能第一次查詢還沒(méi)有返回便進(jìn)行了第二次查詢,那么返回的數(shù)據(jù)將是兩次查詢的結(jié)果,造成查詢結(jié)果的混亂,如果使用的是axios可以利用axios.CancelToken來(lái)終止上一次的異步請(qǐng)求,防止舊關(guān)鍵字查詢覆蓋新輸入的關(guān)鍵字查詢結(jié)果。
高亮顯示
通過(guò)RegExp實(shí)現(xiàn)對(duì)關(guān)鍵詞的替換,通過(guò)添加class實(shí)現(xiàn)關(guān)鍵詞高亮顯示
changeColor (resultsList) {
resultsList.map((item, index) => {
// console.log('item', item)
if (this.keyWords && this.keyWords.length > 0) {
// 匹配關(guān)鍵字正則
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方法將查詢出來(lái)的數(shù)據(jù)傳遞過(guò)來(lái)通過(guò)RegExp來(lái)將關(guān)鍵詞替換成huml標(biāo)簽,同時(shí)用vue中的v-html進(jìn)行綁定。最后將demo完整的代碼展示出來(lái)
<template>
<div class="Home">
<input v-model="keyWords" type="text" placeholder="請(qǐng)輸入關(guān)鍵詞" @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) {
// 匹配關(guān)鍵字正則
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>
最后,如果本文對(duì)你的學(xué)習(xí)或者工作有幫助的話,麻煩給個(gè)star鼓勵(lì)下啦~~~
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue+ElementPlus框架Container 布局容器不能鋪滿整個(gè)屏幕的解決方案
這篇文章主要介紹了vue+ElementPlus框架Container 布局容器不能鋪滿整個(gè)屏幕的解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
vue3.0 Reactive數(shù)據(jù)更新頁(yè)面沒(méi)有刷新的問(wèn)題
這篇文章主要介紹了vue3.0 Reactive數(shù)據(jù)更新頁(yè)面沒(méi)有刷新的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
vue + any-touch實(shí)現(xiàn)一個(gè)iscroll 實(shí)現(xiàn)拖拽和滑動(dòng)動(dòng)畫(huà)效果
這篇文章主要介紹了vue + any-touch實(shí)現(xiàn)一個(gè)iscroll實(shí)現(xiàn)拖拽和滑動(dòng)動(dòng)畫(huà)效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
Vue項(xiàng)目中new?Vue()和export?default{}的區(qū)別說(shuō)明
這篇文章主要介紹了Vue項(xiàng)目中new?Vue()和export?default{}的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
ubuntu中利用nginx部署vue項(xiàng)目的完整步驟
Nginx是一款輕量級(jí)的Web服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,在BSD-like 協(xié)議下發(fā)行,下面這篇文章主要給大家介紹了關(guān)于ubuntu中利用nginx部署vue項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2022-02-02
vue監(jiān)聽(tīng)滾動(dòng)事件實(shí)現(xiàn)滾動(dòng)監(jiān)聽(tīng)
本文主要介紹了vue監(jiān)聽(tīng)滾動(dòng)事件實(shí)現(xiàn)滾動(dòng)監(jiān)聽(tīng)的相關(guān)資料。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04
關(guān)于Vue父子組件傳參和回調(diào)函數(shù)的使用
這篇文章主要介紹了關(guān)于Vue父子組件傳參和回調(diào)函數(shù)的使用,我們將某段代碼封裝成一個(gè)組件,而這個(gè)組件又在另一個(gè)組件中引入,而引入該封裝的組件的文件叫做父組件,被引入的組件叫做子組件,需要的朋友可以參考下2023-05-05

