基于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中神奇的call()方法
Mar 12 Javascript
JS选项卡动态替换banner图片路径的方法
May 11 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
Sep 28 Javascript
JavaScript常用基础知识强化学习
Dec 09 Javascript
AngularJS基础 ng-focus 指令简单示例
Aug 01 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
Dec 26 Javascript
ES5学习教程之Array对象
Apr 01 Javascript
webpack独立打包和缓存处理详解
Apr 03 Javascript
vue2.0结合Element实现select动态控制input禁用实例
May 12 Javascript
原生javascript实现的全屏滚动功能示例
Sep 19 Javascript
解决vue-cli创建项目的loader问题
Mar 13 Javascript
微信小程序实现发送验证码按钮效果
Dec 20 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爆绝对路径方法收集整理
2012/09/17 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
js中if语句的几种优化代码写法
2011/03/12 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
关于div自适应高度/左右高度自适应一致的js代码
2013/03/22 Javascript
JS操作数据库的实例代码
2013/10/17 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
2014/07/18 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
2016/08/11 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
浅谈vue+webpack项目调试方法步骤
2017/09/11 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
elementUI多选框反选的实现代码
2019/04/03 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
python 系统调用的实例详解
2017/07/11 Python
Python实现简易版的Web服务器(推荐)
2018/01/29 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
python二维键值数组生成转json的例子
2019/12/06 Python
关于box-sizing的全面理解
2016/07/28 HTML / CSS
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
美国保健品专家:Life Extension
2018/05/04 全球购物
专科文秘应届生求职信
2013/11/18 职场文书
临床医学专业学生的自我评价分享
2013/11/21 职场文书
超市业务员岗位职责
2013/12/05 职场文书
结婚典礼证婚词
2014/01/11 职场文书
单位提档介绍信
2014/01/17 职场文书
旷课检讨书1000字
2014/02/14 职场文书
2014年大班元旦活动方案
2014/02/26 职场文书
招标承诺书
2014/08/30 职场文书
质量负责人岗位职责
2015/02/15 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
windows系统安装配置nginx环境
2022/06/28 Servers