基于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 相关文章推荐
jquery遍历input取得input的name
Apr 27 Javascript
jQuery提交多个表单的小技巧
Jul 27 Javascript
浅谈JavaScript实现面向对象中的类
Dec 09 Javascript
Angularjs 自定义服务的三种方式(推荐)
Aug 02 Javascript
基于JS实现类似支付宝支付密码输入框
Sep 02 Javascript
vue制作加载更多功能的正确打开方式
Oct 12 Javascript
vue2.0构建单页应用最佳实战
Apr 01 Javascript
VueJS事件处理器v-on的使用方法
Sep 27 Javascript
使用axios实现上传图片进度条功能
Dec 21 Javascript
对vue中methods互相调用的方法详解
Aug 30 Javascript
详解React中合并单元格的正确写法
Jan 08 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
Aug 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 getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
Z-Blog中用到的js代码
2007/03/15 Javascript
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
2007/04/12 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
浅谈js数据类型判断与数组判断
2016/08/29 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
2017/01/16 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
ES6中的箭头函数实例详解
2017/04/06 Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
2017/10/13 jQuery
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
深入理解vue-class-component源码阅读
2019/02/18 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
2019/09/14 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
python爬虫超时的处理的实例
2018/12/19 Python
Python 存储字符串时节省空间的方法
2019/04/23 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
Python 一键获取百度网盘提取码的方法
2019/08/01 Python
Python3直接爬取图片URL并保存示例
2019/12/18 Python
python中str内置函数用法总结
2020/12/27 Python
如何利用python 读取配置文件
2021/01/06 Python
简述安装Slackware Linux系统的过程
2012/05/08 面试题
高校学生干部的自我评价分享
2013/11/04 职场文书
自荐书范文
2013/12/08 职场文书
高三毕业寄语
2014/04/10 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
淘宝客服专员岗位职责
2015/04/07 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript