實(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ì)下啦~~~
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com