基于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 面向对象 function类
May 13 Javascript
javascript各浏览器中option元素的表现差异
Apr 07 Javascript
javascript重复绑定事件造成的后果说明
Mar 02 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
Nov 07 Javascript
JS执行删除前的判断代码
Feb 18 Javascript
JavaScript中的getTime()方法使用详解
Jun 10 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
Aug 16 Javascript
微信小程序 生命周期详解
Oct 12 Javascript
利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
Apr 24 Javascript
基于jQuery封装的分页组件
Jun 26 jQuery
ES6函数和数组用法实例分析
May 23 Javascript
ES6中的类(Class)示例详解
Dec 09 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
PHP+FLASH实现上传文件进度条相关文件 下载
2007/07/21 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
2017/02/14 PHP
Yii2.0建立公共方法简单示例
2019/01/29 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
JavaScript 继承使用分析
2011/05/12 Javascript
jQuery中clone()方法用法实例
2015/01/16 Javascript
原生js实现节日时间倒计时功能
2017/01/18 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
jQuery Plupload上传插件的使用
2017/04/19 jQuery
javascript实现延时显示提示框效果
2017/06/01 Javascript
vue slot 在子组件中显示父组件传递的模板
2018/03/02 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
原生js实现弹窗消息动画
2020/11/20 Javascript
python的迭代器与生成器实例详解
2014/07/16 Python
Python监控主机是否存活并以邮件报警
2015/09/22 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
python如何查看微信消息撤回
2018/11/27 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
Python变量访问权限控制详解
2019/06/29 Python
Python3 Click模块的使用方法详解
2020/02/12 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
2020/04/24 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
使用css如何制作时间ICON方法实践
2012/11/12 HTML / CSS
Android interview questions
2016/12/25 面试题
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
函授毕业生自我鉴定
2013/11/06 职场文书
大学生求职信范文应怎么写
2014/01/01 职场文书
开会迟到检讨书
2014/01/08 职场文书
员工评语大全
2014/01/19 职场文书
工作所在部门证明
2014/09/21 职场文书