基於Vue實現關鍵詞實時搜尋高亮顯示關鍵詞
阿新 • • 發佈:2018-12-30
最近在做移動real-time-search於實時搜尋和關鍵詞高亮顯示的功能,通過部落格的方式總結一下,同時希望能夠幫助到別人~~~
好了閒話不多說直接上程式碼
實時搜尋
實時搜尋通過觸發input事件和定時器來實現
<input v-model="keyWords" type="text" placeholder="請輸入關鍵詞" @input="handleQuery">
在每次輸入框的值變化的時候都會執行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方法中有一個定時器,通過設定時間來控制搜尋的執行,由於輸入時input的框中的值總是變化的,所以每次變化都會執行一次handleQuery,我們通過clearTimer方法清除timer定時器,如果兩次輸入的間隔時間小於你設定的時間間隔(2s)的話第一個定期器將會被清除,同時執行第二個定時器。這樣就實現了實施搜多的控制,而不是每次輸入的時候就去請求資料。
注意:如果時間設定過短或者說我們伺服器請求較慢的話,可能第一次查詢還沒有返回便進行了第二次查詢,那麼返回的資料將是兩次查詢的結果,造成查詢結果的混亂,如果使用的是axios可以利用axios.CancelToken
高亮顯示
通過RegExp實現對關鍵詞的替換,通過新增class實現關鍵詞高亮顯示
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 }
在查詢到結果後執行changeColor方法將查詢出來的資料傳遞過來通過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鼓勵下啦~~~