基于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 相关文章推荐
Javascript 的addEventListener()及attachEvent()区别分析
May 21 Javascript
jquery中获取元素的几种方式小结
Jul 05 Javascript
jquery Mobile入门—外部链接切换示例代码
Jan 08 Javascript
JavaScript里实用的原生API汇总
May 14 Javascript
详细分析使用AngularJS编程中提交表单的方式
Jun 19 Javascript
vue loadmore 组件滑动加载更多源码解析
Jul 19 Javascript
nginx配置React静态页面的方法教程
Nov 03 Javascript
Echart折线图手柄触发事件示例详解
Dec 16 Javascript
详解在React项目中安装并使用Less(用法总结)
Mar 18 Javascript
小程序登录/注册页面设计的实现代码
May 24 Javascript
JavaScript面向对象中接口实现方法详解
Jul 24 Javascript
Vue+penlayers实现多边形绘制及展示
Dec 24 Vue.js
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
解决laravel 表单提交-POST 异常的问题
2019/10/15 PHP
php7 参数、整形及字符串处理机制修改实例分析
2020/05/25 PHP
把html页面的部分内容保存成新的html文件的jquery代码
2009/11/12 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
JQuery插件开发示例代码
2013/11/06 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
2016/04/07 Javascript
AngularJS基础 ng-mouseleave 指令详解
2016/08/02 Javascript
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
利用js将ajax获取到的后台数据动态加载至网页中的方法
2018/08/08 Javascript
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
[02:27]2014DOTA2国际邀请赛 VG赛后采访:更大的挑战在等着我们
2014/07/13 DOTA
[47:20]DAC2018 4.4 淘汰赛 Optic vs Mineski 第一场
2018/04/05 DOTA
Python实现约瑟夫环问题的方法
2016/05/03 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
对Python3之进程池与回调函数的实例详解
2019/01/22 Python
Python运行DLL文件的方法
2020/01/17 Python
django中related_name的用法说明
2020/05/20 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
优瑞自动咖啡机官网:Jura
2018/09/29 全球购物
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
Yahoo-PHP面试题4
2012/05/05 面试题
思想政治教育专业个人求职信范文
2013/12/20 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
《颐和园》教学反思
2014/02/26 职场文书
大学新学期计划书
2014/04/28 职场文书
班风学风建设方案
2014/05/06 职场文书
小学生纪念九一八事变演讲稿
2014/09/14 职场文书
2015毕业生实习期工作总结
2015/04/09 职场文书
2016先进集体事迹材料范文
2016/02/25 职场文书
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS