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


Posted in Javascript onJuly 21, 2018

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

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

下面是demo运行的效果图

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

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

实时搜索

实时搜索通过触发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鼓励下啦~~~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
非常棒的10款jQuery 幻灯片插件
Jun 14 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
Jun 05 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
Jan 05 Javascript
JS对象是否拥有某属性如何判断
Feb 03 Javascript
Vue的MVVM实现方法
Aug 16 Javascript
理解javascript async的用法
Aug 22 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
Jan 08 jQuery
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
Feb 26 Javascript
解决vue接口数据赋值给data没有反应的问题
Aug 27 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
Nov 12 jQuery
react国际化化插件react-i18n-auto使用详解
Mar 31 Javascript
js 实现Material UI点击涟漪效果示例
Sep 23 Javascript
jQuery实现的点击按钮改变样式功能示例
Jul 21 #jQuery
jQuery实现输入框的放大和缩小功能示例
Jul 21 #jQuery
jQuery实现table表格信息的展开和缩小功能示例
Jul 21 #jQuery
浅谈vue父子组件怎么传值
Jul 21 #Javascript
通过webpack引入第三方库的方法
Jul 20 #Javascript
详解Koa中更方便简单发送响应的方式
Jul 20 #Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
Jul 20 #Javascript
You might like
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
2016/04/15 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
php array_pop 删除数组最后一个元素实例
2016/11/02 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
JS 实现双色表格实现代码
2009/11/24 Javascript
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
jQuery.event兼容各浏览器的event详细解析
2013/12/18 Javascript
招聘网站基于jQuery实现自动刷新简历
2015/05/10 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
Python模拟登录12306的方法
2014/12/30 Python
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
matplotlib subplots 调整子图间矩的实例
2018/05/25 Python
在Pycharm terminal中字体大小设置的方法
2019/01/16 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
香港时装购物网站:ZALORA香港
2017/04/23 全球购物
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
zooplus德国:便宜地订购动物用品、动物饲料、动物食品
2020/05/06 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
必须要使用游标的SQL语句有那些
2012/05/07 面试题
How TDD works
2012/09/30 面试题
应届大学毕业生找工作的求职信范文
2013/11/29 职场文书
环境卫生标语
2014/06/09 职场文书
公司股东出资证明书
2014/11/01 职场文书
公司年会开场白
2015/06/01 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书
Elasticsearch 数据类型及管理
2022/04/19 Python