Vue3 中实现关键字高亮的一种思路

news2024/11/19 3:33:28

前言: 这几天在项目中遇到了需要将用户在搜索框中输入的文字高亮的效果,思考了很久,暂时没有想到更优雅的解决方式,于是采用了最简单的一种思路来实现,特来记录一下。


一. 需求的场景

  1. 我接手的这个需求需要和后端搭配,前端需要根据用户在搜索框🔍中输入的关键词去请求数据库,后端会根据关键词检索出相关文章的内容返回给我(字符串形式)。十分类似于下面的这种效果。
    搜索.gif

  2. 这里对于我们前端来讲,主要的目的就是如何正确的处理按下回车后,后端返回给我的这些字符串。

二. 理清思路

  1. 首先我们需要清晰的知道,如何更改一个文字的样式?最简单的方法就是加类名。
    image.png
    下面是效果
    image.png

  2. 假设现在后端返回给我们下面这样一段文字。
    image.png
    现在的需求是把 写博客 这三个字用高亮去展示。

  3. 如果不考虑实现的可行性,你是否第一时间能联想到这样的写法呢?
    image.png
    效果如下
    image.png

  4. 我们发现,这种思路是非常可行的!!!那么现在的问题就变成了,如何动态将一段字符串处理成关键词被带类名的 span 标签包裹的形式。

  5. 说到了字符串的替换,那肯定第一时间会想到 String.replace
    image.png

  6. 在这里我们需要特别特别注意!!replace 的匹配模式是一个字符串格式的话,那么它仅只会替换匹配的第一个符合的字符,而不会全员替换。什么意思呢?我们思考下面的代码。
    image.png
    我们其实期望 result 的值是将数字 1 全部替换为数字 9 的输出结果。也就是999 222 333。而实际的输出结果却是下面的:
    image.png
    输出结果为 911 222 333,它只更改了第一项,这样就导致了一个问题,我们只会替换第一个关键词。

  7. 如何解决呢?这里需要将第一个参数由字符串变更为正则表达式。这里我直接写答案,因为正则这个东西不是三言两语能讲清楚的,需要读者自行查阅 MDN
    image.png
    为了防止有的小伙伴看不清楚,我把源码贴到了下面。

const name = "111 222 333";
const _reg = new RegExp("1", "g");
const result = name.replace(_reg, "9");
console.log("result", result); // 期望:"999 222 333"
  1. 这样就好了吗?没错这样就是全局匹配替换了,让我们测试一下。
    image.png

  2. 我们更换为更接近真实数据的一段字符串测试一下。我们马上要把今天全局替换成昨天
    image.png
    输出结果为:
    image.png
    嗯,很完美。

三. 替换为 span 包裹的数据

  1. 那我们顺着这个思路,马上可以想到我可以写一个函数,专门根据关键词参数去替换关键词。
    image.png

  2. 我们马上测试一下,看看效果。
    image.png
    输出为
    image.png

3.呀,它好像把 span 当成字符串渲染了,这种情况怎么解决?别着急,非常简单。

四. v-html 指令

  1. 让我们先看一下官方是如何解释这个指令的。
    image.png

  2. 这里重点需要看这句话。
    image.png

  3. 那么我们就可以直接这样写。
    image.png

  4. 这里解释一下,主要是因为 v-html 指令期待绑定一个字符串,而我们的 highLightWord 的返回值正好是字符串格式的数据,所以才可以像上面这样写。
    image.png

  5. 让我们看一下效果:
    image.png
    好像没有什么用,怎么回事呢?我直接揭晓答案,这个组件的 style 标签不允许使用局域的,只能使用全局的。(具体原因希望读者自己去深入研究一下)
    image.png

6.再看一下确实已经达到我们的关键字高亮效果了
image.png

总结

总感觉这种方案不是特别优雅🤔,如果有大神可以在评论区指导另一种写作方案,我们共同讨论不失为一种乐趣~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搞量化先搞数(下):A股历史行情免费抓取实战

上一节我们学习了如何抓取A股的股票列表,我们成功地将股票列表保存到了本地文件(或数据库)中。那么这一节,我们就来看下如何免费获取A股的历史行情数据。文末附全套代码。 一、寻找提供行情数据的网站 首先我们百度搜索一支股票的名字+行情,看下都哪些网站提供该数据。 …

Docker getting started

系列文章目录 Docker 概述 Docker getting started 文章目录系列文章目录前言一、容器及镜像的概念二、容器化一个应用三、更新应用四、分享应用五、持久化数据存储volume mount 和 bind mount比较Container volumesbind mounts六、跨多容器的应用七、Docker 其它八、Docker 图…

学习 Linux 内核书籍推荐

原文链接,欢迎关注: 你为什么学习 Linux 内核? - CodeAllen的回答 - 知乎 https://www.zhihu.com/question/31369673/answer/2894981254 主要是工作需要,其实对于我自己的工作来说,在Linux开发的具体业务和算法才是重…

2023年PMP考试难不难?

整个考试的考察方向转向还是比较大的,基本上以“价值传递”和“以人为本”这两个出发点来考察项目经理所需要的能力。 1}新版提纲题目数量的变化 总题量从200道减少到180道,所以答题时间上相对变的宽裕一些。考试时间230分钟,中间有十分钟休…

前端状态管理:Vuex、Flux、Redux、MobX概念篇

概念准备 【状态管理模式】 可以借鉴 Vuex 官方文档的解释:什么是“状态管理模式” 状态管理的目标(意义) 各组件通过数据响应机制对共享状态进行高效的状态更新,说白了就是不同组件对需要共享的数据的变更和同步。 1. Vuex …

学网络运维与安全前景怎么样?

近几年,网络安全问题频频爆发,多数人看不到背后的隐患,但是,企业却因此损失惨重。比如:FaceBook数据泄露2018年上半年,FaceBook 5000万用户数据泄露,导致其市值蒸发360亿美元,品牌遭遇声誉危机。…

markdown和latex常用部分参考@注脚@链接跳转@csdn

文章目录refmarkdown和latex常用部分参考typora文档基础语法扩展语法链接内联链接的方式将链接提取出来链接示例typora的支持LinksInline LinksInternal Links🎈Reference LinksURLs文章内部跳转(Heading IDs)🎈My Great Heading注脚(Footnotes)&#x1…

攻防世界1.新手练习区

4.攻防世界1.新手练习区 1.view_source 访问url: http://111.200.241.244:48855/ 鼠标点击右键不起作用,F12审查元素 得到flag为cyberpeace{0f3a3e4ab8c8664f3cf40d4240ec7b53} 2.robots 访问url: http://111.200.241.244:34362/ rob…

VMware vSphere 8.0b 发布下载 - 企业级工作负载平台

ESXi 8.0.0b & vCenter Server 8.0.0b GA (General Availability) 请访问原文链接:https://sysin.org/blog/vmware-vsphere-8/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 2023-02-14,vSphe…

机器学习笔记之生成模型综述(五)重参数化技巧(随机反向传播)

机器学习笔记之生成模型综述——重参数化技巧[随机反向传播]引言回顾神经网络的执行过程变分推断——重参数化技巧重参数化技巧(随机反向传播)介绍示例描述——联合概率分布示例描述——条件概率分布总结引言 本节将系统介绍重参数化技巧。 回顾 神经网络的执行过程 上一节…

机器视觉----易灵思FPGA

一、机器视觉概述 机器视觉无处不在,产品上如果有了机器视觉,那么这个产品在很大的意义上已经赋予了机器智能。例如机器人、无人机、工业检测,这些都需要机器视觉,但是他们的传感器和算法都不同。我们今天重点讨论工业相机行业的应…

大模型相关技术综述

中文大模型、多模态大模型&大模型训练语料持续迭代大模型演进历史预训练模型word2vecword2vec属于NLP领域无监督学习和比较学习的先祖。精髓在于可以用不带标签的文本语料输入神经网络模型,就可以学习到每个词的带语的词向量表示。它背后原理其实就是人类讲出来…

真实3D地形生成器【免费在线】

Terrain3D是一个免费的在线3D地形生成器,只需指定地球上的坐标,就可以自动生成附近区域的3D地形同时叠加卫星影像,并且可以导出GLTF格式的3D地形模型。 推荐:使用 NSDT场景设计器 快速搭建 3D场景。 使用Terrain3D生成真实世界的3…

字节青训营——秒杀系统设计学习笔记(三)

限流算法 限流顾名思义,就是对请求或并发数进行限制;通过对一个时间窗口内的请求量进行限制来保障系统的正常运行。如果我们的服务资源有限、处理能力有限,就需要对调用我们服务的上游请求进行限制,以防止自身服务由于资源耗尽而…

JavaSE学习day7_02 封装和构造方法

4. 封装 面向对象的三大特征: 封装、继承、多态 封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为。 比如人画圆:”画“这个行为应该封装在圆这个类,为什么?因为”画“圆要知道圆…

Pandas基础与实例——人工智能基础

本文目录一、 Series1. 将列表强转为Series2. 将字典强转为Series3. 访问Series中的数据3.1 第一套检索方法3.2 第二套检索方法4. Series常用属性二、Pandas日期类型数据处理1. 将字符串转为datetime类型2. 与1等价的方式3. 单独取出年月日4. 日期运算5. 生成一组日期6. 生成工…

AJAX笔记(二)Fetch和axios

1、Fetch 1.1、XMLHttpRequest的缺陷 1.2、fetch的get写法 1.3、fetch的post写法 1.4、fetch的put写法 1.5、fetch的patch写法 1.6、fetch的delete写法 2、axios 2.1、axios的介绍 2.2、axios的get写法 2.3、axios的post写法(图一json写法和图二三form写法&#x…

Django项目部署-uWSGI

Django项目部署-uWSGIDjango运维部署框架整体部署架构web服务器与web应用服务器的区别部署环境准备安装python3安装mariadb安装Django和相关模块Django托管服务器uWSGI使用uWSGI配置使用Django运维部署框架 整体部署架构 操作系统: Linux 。优势:生态系统丰富&…

NC113 验证IP地址

验证IP地址_牛客题霸_牛客网 描述 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址 IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1&#…

苹果手机怎么下载手机铃声?图文教程,快速学会

很多小伙伴喜欢使用苹果手机,可是苹果手机里的铃声自己并不是很喜欢听,想要下载一些好听的歌曲更换自己的手机铃声。苹果手机怎么下载手机铃声?别着急,今天小编以图文的方式,教教大家如何使用苹果手机下载手机铃声。 苹…