vue3实现搜索,并标红关键字,内容两行省略,展示出现关键字的部分,没有就内容从头排序

时间: 2024-04-29 13:23:30 浏览: 12
以下是一个简单的实现: ```html <template> <div> <input v-model="searchText" placeholder="请输入关键字" @input="search" /> <ul> <li v-for="(item, index) in filteredList" :key="index"> <div v-html="highlight(item.content)"></div> </li> </ul> </div> </template> <script> export default { data() { return { list: [ { id: 1, content: "这是一段测试文本,没有关键字" }, { id: 2, content: "这是一段含有关键字的测试文本" }, { id: 3, content: "关键字可能出现在文本的任何位置,比如这里" }, { id: 4, content: "文本也可能包含多个关键字,比如这里的关键字和关键字" }, { id: 5, content: "关键字也可能出现在文本的首尾,比如这个关键字和这个关键字" }, ], searchText: "", }; }, computed: { filteredList() { if (this.searchText === "") { return this.list; } else { const regex = new RegExp(this.searchText, "gi"); return this.list.filter((item) => regex.test(item.content)).sort((a, b) => { const indexA = a.content.indexOf(this.searchText); const indexB = b.content.indexOf(this.searchText); if (indexA === -1 || indexB === -1) { return indexA - indexB; } else { return indexA - indexB || a.content.localeCompare(b.content); } }); } }, }, methods: { search() { // 触发computed的filteredList更新 }, highlight(text) { const regex = new RegExp(this.searchText, "gi"); return text.replace(regex, "<span style='color:red'>$&</span>").split("\n").slice(0, 2).join("<br/>") + "..."; }, }, }; </script> ``` 在这个实现中,我们首先使用`v-model`指令绑定搜索框的值,然后使用`@input`监听输入框的输入事件,在输入改变时触发`search`方法更新过滤后的列表。 `filteredList`是一个计算属性,它根据`searchText`过滤原始列表,并按照以下规则排序: 1. 如果两个文本都不包含关键字,则按照原始顺序排序。 2. 如果只有一个文本包含关键字,则包含关键字的文本排在前面。 3. 如果两个文本都包含关键字,则关键字第一次出现的位置靠前的文本排在前面。如果两个文本的关键字位置相同,则按照文本内容的字典序排序。 `highlight`方法将匹配的关键字用`<span>`标签包裹,并将文本分成两行,只展示前两行内容。

相关推荐

最新推荐

recommend-type

vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)

主要介绍了vue项目使用高德地图的定位及关键字搜索功能的实例代码,也是小编踩了无数坑总结出来的经验,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

vue实现全匹配搜索列表内容

主要为大家详细介绍了vue实现全匹配搜索列表内容,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

基于Vue实现tab栏切换内容不断实时刷新数据功能

在项目开发中遇到这样需求,就是有几个tab栏,每个tab栏对应的ajax请求不一样,内容区域一样,内容为实时刷新数据,实现方法其实很简单的,下面小编给大家带来了基于Vue实现tab栏切换内容不断实时刷新数据功能,需要...
recommend-type

详解Vue demo实现商品列表的展示

主要介绍了Vue demo实现商品列表的展示,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

VUE 3D轮播图封装实现方法

主要为大家详细介绍了VUE 3D轮播图封装实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

从键盘输入一段英文字符串,其中包含多个字母‘h',请编写程序利用正则表达式,将英文字符串中的’h'全部改为‘H’

好的,我可以帮您解决这个问题。 您可以使用 Python 编写一个程序来实现这个功能。具体步骤如下: 1. 首先导入 re 模块,这个模块是 Python 中用于处理正则表达式的模块。 2. 然后定义一个包含英文字符串的变量,例如: text = "This is a string containing multiple h's." 3. 接下来,使用 re.sub() 方法来进行替换操作。re.sub() 方法的第一个参数是正则表达式,第二个参数是替换的字符或字符串,第三个参数是被替换的字符串。在这个例子里,我们需要将所有的小写字母 h 替换成大写字母 H,所以正则表达式可以写成
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。