基于vue的实时搜索并高亮显示关键词

一、搜素效果如下:

二、核心

1)利用oninput属性来触发搜素功能

2)利用RegExp来对字符串来全局匹配关键字,利用replace方法来对匹配的关键字进行嵌入高亮的<span class="gaoliang">标签,最后利用v-html来嵌入html标签来达到关键字高亮显示

3)利用axios.CancelToken来终止上一次的异步请求,防止旧关键字查询覆盖新输入的关键字查询结果。

三、代码

1)HTML  搜索框部分绑定input事件(搜索框独立出来,作为一个基础组件(叫SearchToolbar.vue),嵌入到KnowledgeSearch.vue中)

<input type="text" class="input-search" placeholder="请输入搜索内容" v-model.trim="searchKey" @input="searchEvent" ref="searchInput" autocomplete="off" autocapitalize="off" autocorrect="off"/>

2)因为input绑定了输入监听事件@input,每一次输入值的改变,都会触发方法searchEvent(),尤其是在输入搜索关键字的时候,这种情况必然发生发送多次http异步请求,这样频繁地请求会导致流量损耗与性能下降。

如何解决?

我们利用setTimeout与clearTimeout元素,控制输入间隔为500ms,如果超过500s还没输入任何东西,就会向后端发送http异步请求。例如在搜索框种输入1,然后500ms过去之后,就会发送异步请求,如果在输入1之后的500ms输入值,例如我在499ms输入了值‘2’,那么上一次关键字为1的异步请求就会取消,进而进行关键字为‘12’的异步请求,并等待500ms。代码如下:

searchEvent() {
      this.clearTimer();
      if (this.searchKey && this.searchKey.length > 0) {
        //获取当前延时函数的ID,便于后面clearTimeout清除该ID对应的延迟函数
        this.timer = setTimeout(() => {
          this.$emit(‘searchHandler‘, this.searchKey);
        }, 500);
      } else {
        this.$emit(‘searchHandler‘, this.searchKey);
      }
},

clearTimer() {
      if (this.timer) {
        clearTimeout(this.timer);
      }
}

注意,你仔细想想,这里还存在一个漏洞。根据关键字发送异步http请求,假如在网络环境并不太好的情况下,异步请求可能经过2秒才返回关键字为‘成’的数据给我。然而,我在输入完关键字‘成’,超过500ms之后在输入‘龙’,那么之前的‘成’关键字的http异步请求已经发送给了服务器(要经过2s才返回数据给我。),而关键字为‘成龙’的http异步请求也发送过去了,它的响应时间是1s就返回数据。那么经过2s之后,得到的将会是关键字为‘成’的数据。因为最新的‘成龙’数据(1s)已经被‘成’数据(2s)所覆盖了。

3)利用axios.CancelToken来终止上一次的异步请求,防止旧关键字查询覆盖新输入的关键字查询结果。

import httpService from ‘@/services/HttpService‘;
<script>
export default{
	data(){
		return{
			$http: null,
			CancelToken: null,
			cancel: null,
		}
	},
	methods{
		queryDataListByKey() {
			if (this.searchKey.length === 0) {
				this.loadedData = false;
				this.dataList = [];
				return;
			}

			let params = {
				‘pageNo‘: this.pageNo,
				‘pageSize‘: this.pageSize,
				‘keyWord‘: this.searchKey
			};
			this.loading(true);              // this.cancel === null,意味着第一次请求
			if (this.cancel) {                   // 取消上一次的异步请求
				this.cancel(‘canceled by user‘);
			}
			this.$http.get(‘rule/findRuleListByKeyWord‘, {                   // 每一次请求关键字资源的http异步请求,都要新建一个异步取消操作实例,并赋值给this.cancel
				cancelToken: new this.CancelToken((c) => {
					this.cancel = c;
				}),
				‘params‘: params
			}).then((res) => {
				this.loading(false);
				this.loadedData = true;
				this.processDataList(res);
			}, (error) => {
				this.loading(false);
				this.loadedData = true;
				this.loadMoreConfig.loading = true;
				if (error !== null) {
					this.$vux.toast.show({ text: ‘数据加载失败‘, type: ‘text‘ });
				}
			});
		},
	}
}
</script>

4)v-html

时间: 2024-11-14 12:48:32

基于vue的实时搜索并高亮显示关键词的相关文章

和我一起打造个简单搜索之SpringDataElasticSearch关键词高亮

前面几篇文章详细讲解了 ElasticSearch 的搭建以及使用 SpringDataElasticSearch 来完成搜索查询,但是搜索一般都会有搜索关键字高亮的功能,今天我们把它给加上. 系列文章 一.和我一起打造个简单搜索之ElasticSearch集群搭建 二.和我一起打造个简单搜索之ElasticSearch入门 三.和我一起打造个简单搜索之IK分词以及拼音分词 四.和我一起打造个简单搜索之Logstash实时同步建立索引 五.和我一起打造个简单搜索之SpringDataElasti

VBox 一款基于vue开发的音乐盒 序章

之前自己基于vue写了一个 Mplayer, github地址:https://github.com/xiangwenhu/MPlaer, 演示地址:http://babydairy2017.cloudapp.net:3000/index#/index 只有简单的搜索播放随心听功能,样式适配上也很差, 路由就两个,数据都走vuex,数据转发是用nodejs自己转发,而且只是PC能比较好的展现,之后不了了之,偶尔也自己上来听听歌曲. 有一天,抬头看,有一片云,特别的蓝,风一吹,一阵花香飘来,美好,

Lucene —— 搜索结果高亮显示

零. 前言 谷歌. 百度的搜索结果在关键词命中的时候会高亮显示(飘红), Lucene 也提供了高亮显示的实现, 借助 Lucene 的 Highlighter 类可以快速实现搜索结果高亮. 一. 代码示例 本例使用 Lucene 5.3.1 的包 package com.wenniuwuren.lucene; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.standard.Sta

使用js实现前端内容实时搜索

本文主要基于项目的一个基本搜索功能,前端显示所有用户的在线评论信息:用户可以 根据需要在搜索框中输入搜索关键字,实时搜索出相应的显示结果,并高亮显示. 实现代码: /** * @brief 搜索一条房间中的符合要求的发言 * @param $keyword 搜索的关键字 */ var isSkip = false; $('.search-icon').click(function() { showSearch(); }); function showSearch() { $('.search-c

sphinx实时索引和高亮显示

sphinx实时索引和高亮显示 时间 2014-06-25 14:50:58  linux技术分享 -欧阳博客 原文  http://www.wantlearn.net/825 主题 Sphinx数据库 上次介绍了coreseek与sphinx的区别,并详细记录了安装coreseek文档说明,以及给php加上sphinx模块,详细内容请参考我写的coreseek详解这篇文档,这次主要介绍sphinx是如何做到实时索引.首先配置进入到coreseek配置文件目录,对原始配置文件进行配制,这里介略说

开源分布式搜索平台ELK+Redis+Syslog-ng实现日志实时搜索

logstash + elasticsearch + Kibana+Redis+Syslog-ng ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便.支持通过HTTP使用JSON进行数据索引. logstash是一个应用程序日志.事件的传输.处理.管理和搜索的平台.你可以用它来统一对应用程序日志进行收集管理,提供 Web 接口用于查询和统计.其实logstash是可以被别的替换,比如常见

Twitter实时搜索系统EarlyBird

twitter对存档的tweet使用lucene做全量索引,新发的推文则是实时索引,实时检索(10秒之内索引).实时索引和检索系统叫EarlyBird. 感觉写得比较清楚简洁,只要这些信息足够真实可信,完全可以做实现参考. 我简单做了几个记录: 1)基于lucene + java,michael busch是lucene committer 2)词典直接用哈希表,因此不支持term的prefix,偏序查询,哈希表使用开放链址法实现,避免大量小对象gc开销 3)postings列表在optimiz

追求极致的用户体验ssr(基于vue的服务端渲染)

首先这篇博客并不是ssr建议教程,需要ssr入门的我建议也不要搜索博客了,因为官网给出了详细的入门步骤,只需要step by step就可以了,这篇博客的意义是如何使用ssr,可能不同的人有不同的意见,我舍弃了ssr中的vuex和vue-router增加了redis,serverfetch等等实现了适合自己公司的业务,个人认为并不是所有的东西都值得吸收,对我来说我能用到的只是ssr将vue生成一个html和对应的js. 虾面我们来看看什么是服务端渲染? 官网给出的解释: Vue.js 是构建客户

Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,elasticsearch安装配置及中文分词

http://fuxiaopang.gitbooks.io/learnelasticsearch/content/  (中文) 在Elasticsearch中,文档术语一种类型(type),各种各样的类型存在于一个索引中.你也可以通过类比传统的关系数据库得到一些大致的相似之处: 关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns) Elasticsearch ⇒ 索引 ⇒ 类型 ⇒ 文档 ⇒ 字段(Fields)一个Elasticsearch集群可以包含多个索引(数据库),也就是说其