實時搜索通過觸發(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ù)將是兩次查詢的結果,造成查詢結果的混亂,如果使用的是axios可以利用axios.CancelToken來終止上一次的異步請求,防止舊關鍵字查詢覆蓋新輸入的關鍵字查詢結果。
高亮顯示通過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 }
在查詢到結果后執(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鼓勵下啦~~~
聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com