基于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 Scoping and Hoisting 翻译
Jul 03 Javascript
如何让div span等元素能响应键盘事件操作指南
Nov 13 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
Oct 09 Javascript
实现图片预加载的三大方法及优缺点分析
Nov 19 Javascript
node.js+express制作网页计算器
Jan 17 Javascript
javascript回到顶部特效
Jul 30 Javascript
Vue.js实现网格列表布局转换方法
Aug 25 Javascript
weebox弹出窗口不居中显示的解决方法
Nov 27 Javascript
JS获取input[file]的值并显示在页面的实现方法
Mar 09 Javascript
原生js检测页面加载完毕的实例
Sep 11 Javascript
JS实现秒杀倒计时特效
Jan 02 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
Feb 16 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遍历目录viewDir函数
2009/12/15 PHP
PHP PDO函数库详解
2010/04/27 PHP
php下使用strpos需要注意 === 运算符
2010/07/17 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
2020/10/01 PHP
简单谈谈favicon
2015/06/10 PHP
php获取给定日期相差天数的方法分析
2017/02/20 PHP
JS去除右边逗号的简单方法
2013/07/03 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
javascript中的return和闭包函数浅析
2014/06/06 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
Jquery动态替换div内容及动态展示的方法
2015/01/23 Javascript
JS实现进入页面时渐变背景色的方法
2015/02/25 Javascript
Google 爬虫如何抓取 JavaScript 的内容
2017/04/07 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
2019/06/05 Javascript
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
2019/11/06 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
2020/03/07 Javascript
详解webpack的clean-webpack-plugin插件报错
2020/10/16 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
Python中文件的读取和写入操作
2018/04/27 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
解决flask接口返回的内容中文乱码的问题
2020/04/03 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
处理textarea中的换行和空格
2019/12/12 HTML / CSS
京东国际站:JOYBUY
2017/11/23 全球购物
成品仓管员工作职责
2013/12/29 职场文书
信息科学与技术专业求职信范文
2014/02/20 职场文书
休假证明书
2015/06/24 职场文书
三八妇女节新闻稿
2015/07/17 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
导游词之安徽醉翁亭
2020/01/10 职场文书
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android