mysql搜索关键字高亮_基于Vue实现关键词实时搜索高亮显示关键词

本文介绍了如何在Vue应用中实现关键词实时搜索高亮显示。通过监听input事件和使用定时器控制搜索执行,避免频繁请求。使用RegExp匹配关键词并替换为高亮标签,结合v-html实现显示效果。
摘要由CSDN通过智能技术生成

最近在做移动real-time-search于实时搜索和关键词高亮显示的功能,通过博客的方式总结一下,同时希望能够帮助到别人~~~

如果不喜欢看文字的朋友我写了一个demo方便已经上传到了github上,可以clone下来直接看代码 https://github.com/IT0315/rea...

下面是demo运行的效果图

cbb74ed34f0c95e248ff89e3d914d4d9.png

好了闲话不多说直接上代码

实时搜索

实时搜索通过触发input事件和定时器来实现

在每次输入框的值变化的时候都会执行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 =

'' + this.keyWords + ''

resultsList[index].name = item.name.replace(

replaceReg,

replaceString

)

}

})

this.results = []

this.results = resultsList

}

在查询到结果后执行changeColor方法将查询出来的数据传递过来通过RegExp来将关键词替换成huml标签,同时用vue中的v-html进行绑定。最后将demo完整的代码展示出来

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 =

'' + this.keyWords + ''

resultsList[index].name = item.name.replace(

replaceReg,

replaceString

)

}

})

this.results = []

this.results = resultsList

}

}

}

.search-text{

color: red;

}

最后,如果本文对你的学习或者工作有帮助的话,麻烦给个star鼓励下啦~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值