最近在作移动real-time-search于实时搜索和关键词高亮显示的功能,经过博客的方式总结一下,同时但愿可以帮助到别人~~~html
若是不喜欢看文字的朋友我写了一个demo方便已经上传到了github上,能够clone下来直接看代码 https://github.com/IT0315/rea...
下面是demo运行的效果图vue
好了闲话很少说直接上代码ios
实时搜索
实时搜索经过触发input事件和定时器来实现git
<input v-model="keyWords" type="text" placeholder="请输入关键词" @input="handleQuery">
在每次输入框的值变化的时候都会执行handleQuery方法github
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能够利用axios.CancelToken来终止上一次的异步请求,防止旧关键字查询覆盖新输入的关键字查询结果。api
高亮显示
经过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鼓励下啦~~~post