基于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 Select标记中options操作方法集合
Oct 22 Javascript
前台js调用后台方法示例
Dec 02 Javascript
js中匿名函数的创建与调用方法分析
Dec 19 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
Nov 24 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
Jun 17 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
Jul 27 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
Aug 18 Javascript
JavaScript无缝滚动效果的实例代码
Mar 27 Javascript
详解react-router4 异步加载路由两种方法
Sep 12 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
Dec 18 Javascript
利用node实现一个批量重命名文件的函数
Dec 21 Javascript
vue项目开发中setTimeout等定时器的管理问题
Sep 13 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中的global
2014/08/19 PHP
PHP制作万年历
2015/01/07 PHP
thinkPHP简单遍历数组方法分析
2016/05/16 PHP
PHP实现适用于自定义的验证码类
2016/06/15 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
2017/03/14 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
基于jQuery的弹出框插件
2012/03/18 Javascript
在javascript中实现函数数组的方法
2013/12/25 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
详细分析JavaScript中的深浅拷贝
2020/09/17 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
2020/10/24 Javascript
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
python中的插值 scipy-interp的实现代码
2018/07/23 Python
python hook监听事件详解
2018/10/25 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
利用matplotlib为图片上添加触发事件进行交互
2020/04/23 Python
python线程里哪种模块比较适合
2020/08/02 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
前端实现背景虚化但内容清晰且自适应 的实例代码
2019/08/01 HTML / CSS
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
英国奢华护肤、美容和Spa品牌:Temple Spa
2019/11/02 全球购物
面料业务员岗位职责
2013/12/26 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
领导干部失职检讨书
2015/05/05 职场文书
解决Python字典查找报Keyerror的问题
2021/05/26 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python