如何使用Vue3实现文章内容中多个"关键词"标记高亮显示

目录
  • 写在开头
  • 具体实现过程
    • 基本使用
    • props
    • 事件
  • 原理过程
  • 总结

写在开头

话说在某一天,小编正沉迷于掘金沸点中摸鱼,正起劲呢,产品小姐姐突然就跑过来,说时迟那时快,我一个闪电五连鞭,立马把屏幕切换成代码编辑器,绝不能让人看出我没需求了在摸鱼。

然后小姐姐巴拉巴拉讲了一堆,就是想加个"小"需求,小编当场就表现得很为难的样子。

十分正经温柔的对小姐姐说:"你看,我这还有需求没做完呢,分身乏术,再说你这个需求有点麻烦啊,没有一两周搞不定的"。

但实际小编心中暗自窃喜,这需求不难,一个小时能搞定,多一秒都算我输(✪ω✪)。

不过职场的"人情世故"咱得懂,低调行事,多给自己争取一点摸鱼时间。

小姐姐:"行吧,你尽快做就行,需求也不是很赶"。

这波又成功忽悠了一些摸鱼时间,当然,主要还是公司业务一直都是不紧不慢,找公司还得找这种的,公司业务不急,不加班,产品好说话,不投毒,这就是我的梦中情司。

好了好了,稍微废话了一下,咱回归正题来介绍一下具体需求,需求大概过程就是"把一篇文章的关键字标记高亮显示",你没听错,就是这么简单。

当然,具体还有一些小细节:

  • 关键字由后端接口返回,会有多个关键字。
  • 关键字不区分大小写。
  • 统计关键字在文中的个数。
  • 高亮样式需要使用UI提供的样式。
  • ...

具体实现过程

以上这个需求,其实本质就是浏览器的搜索功能,也算是一个比较常见的功能了,记得在 Vue2 有很多插件包可以来快速实现这个功能。奈何小编的项目是 Vue3+TS 的(︶︹︺),不过网上"轮子"很多,经过小编的一顿搜索寻找,果然就找到一个插件挺符合我的需要,下面就来稍微介绍介绍它。

vue-word-highlighter 是一个小众的包,并不出名,Github 上也只会百星出头,不过能用能跑就行,合适才是最好的,小编最近信奉一句话"程序和你一个能跑就行"。

vue-word-highlighter 支持 Vue3Vue2,不过 Vue2 版本是通过 vue-demi 构建的,对 vue-demi 不熟悉的小伙伴还是别用吧(✪ω✪),咱有一说一,用 Vue2 来完成该需求,有其他很多包可以推荐。

至于为什么,正如它文档介绍的:

基本使用

它的使用比较简单的,直接上代码:

<template>
  <div>
    <input v-model="searchValue" />
    <button @click="search">search</button>
    <div>搜索到的个数:{{result.length}}</div>
    <div>搜索到的内容:{{result}}</div>
    <br/>
    <WordHighlighter
      highlightClass="highlight"
      :query="lightQuery"
      :caseSensitive="false"
      :splitBySpace="true"
      @matches="lightEmit">
	<div>
	  我已经远离了你的河流,绝不是疏远,因为我已是身居异土。远远地,依然听得到你翻山越岭、日夜兼程的脚步声,依然无比清晰地看得到你的那条洒满星星的清澈的河流。只要,也只有想起你——故乡,就是异域的那条河流也会洒满故乡的星星。无论醒着还是沉睡,都会重复着那个让人心旌摇曳的画面,星星都在你的河流里百媚地眨眼。因为那条洒满星星的河流途经我无猜的孩童,无知的少年,迷茫的青春,还要经过可知的未来,是不是今后还要交付给大海了呢?那样,大海的那些星星一定是故乡送给他们的馈赠,没有故乡的孕育,大海也会失去灵气,因为大海的源头就在故乡的这头……

	  星星的感情,在城市里总是被耽误。是星星的感情单一,还是城市的滥情呢?如果城市是舞台,星星就不是市民,所以也不是演员。如果天空是舞台,星星就是居民,所以能成为明星。如果河流是舞台,星星就是精灵,她就是大地的灵魂。如今,爱情在城市里就是一个错误,比金钱的质量轻百倍,所以比海洛因更危险。爱情在乡村的河流里,就有了星星的光辉,成就的是海枯石烂的传奇……

	  晴空万里的白昼,总爱涂脂抹粉打扮一番。这样的时候,只有清泉敢从浓妆艳抹的云端踏过,只有披着满身星星的鱼儿敢从蓝天穿过,将自满表现的太阳戏弄一番。浆洗的女人们总爱把笑声抛在河面上,拍打着棒槌当爵士乐的节拍,委婉的歌声随着幸福的河水流淌,斑斓的衣服在白云间飘舞成了彩虹。我听到了大地与天空的窃语,彻底悟出了萨顶顶唱的《万物生》里的深刻与凝重:我看见山鹰在寂寞两条鱼上飞 ,两条鱼儿穿过海一样咸的河水, 一片河水落下来遇见人们破碎 ,人们在行走,身上落满山鹰的灰……

          睡得沉沉的夜,呵欠连连,漫长得没有尽头,无论夜几多的黑,可故乡的河流从也不会迷路,因为有星星这明亮的眼睛。你的人生没有迷路,你的梦没有迷失方向,你的未来总在奔跑的路上,是不是也是借了故乡河流里的星星做慧眼呢?如果河流看不到星星,那肯定会落魄的。如果人生看不到那条飘着星星的河流,如果梦里没有那条飘着星星的河流,如果未来的路上没有那条飘着星星的河流,你是不是都会惊慌失措呢?陌生人能通过那条河流找到你的家,如果没有了她你的心能到家吗?
        </div>
     </WordHighlighter>
  </div>
</template>

<script lang="ts">
import { defineComponent, ref } from "vue";
import WordHighlighter from "vue-word-highlighter";

export default defineComponent({
  name: "App",
  components: {
    WordHighlighter,
  },
  setup() {
    const searchValue = ref<string>();
    const lightQuery = ref<string>();
    const result = ref<Array<string>>([]);

    const search = () => {
      lightQuery.value = searchValue.value;
    };

    const lightEmit = (e: Array<string>) => {
      result.value = e
    }

    return {
        searchValue,
        lightQuery,
        result,
        search,
        lightEmit
    };
  },
});
</script>

<style>
.highlight{
  background-color: transparent;
  color: red;
  font-weight: bold;
}
</style>

是不是超简单,下面贴一下它支持的一些 props 与事件,就又可以愉快的摸鱼了。

props

参数 类型 默认值 说明
query String or RegExp - 搜索内容。
caseSensitive Boolean false 是否区分大小写。
diacriticsSensitive Boolean false 是否区分变音符号,如 uü
splitBySpace Boolean false 是否用空格分割字符串以使其成为搜索字符串,如果设置为false,则默认把搜索内容当成一个整体进行搜索;当 query 为正则时,splitBySpace 默认为 false
highlightTag String <mark /> 标记搜索到的内容所包裹的标签。
highlightClass String or Object or Array - 给标记的内容添加 class,绑定语法类似于 vue
highlightStyle String or Object or Array - 同上 。
wrapperTag String <span /> 整个目标搜索区的容器标签。
wrapperClass String or Object or Array - 给目标搜索区的容器添加 class,绑定语法类似于 vue
textToHighlight String v-slot:default 目标搜索区的内容。

事件

事件名称 说明 回调参数
matches query 参数变化时触发,函数返回搜索到的内容 function(value:Array<String>)

原理过程

等等!!!你以为到这里就完了吗?肯定还没啦。

作为一名技术人,我们需要知晓其中的原理过程才算合格唷。

小编认真翻了一下 vue-word-highlighter 的源码,整体源码内容就百来行代码而已,不算太多,这里我们就不一点点讲解了,小编写个核心方法保准你能懂(不懂来打我呀,略略略)。

function fn(content, keywordArray) {
  if(keywordArray.length === 0) return;

  keywordArray.forEach(keyword => {
    if(keyword && content.indexOf(keyword) !== -1) {
      content = content.replace(new RegExp(keyword, 'g'), `<mark>${keyword}</mark>`);
    }
  });

  return content;
}

好了,到此结束,继续摸鱼了。

总结

到此这篇关于如何使用Vue3实现文章内容中多个"关键词"标记高亮显示的文章就介绍到这了,更多相关Vue3关键词标记高亮显示内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于Vue实现关键词实时搜索高亮显示关键词

    最近在做移动real-time-search于实时搜索和关键词高亮显示的功能,通过博客的方式总结一下,同时希望能够帮助到别人~~~ 如果不喜欢看文字的朋友我写了一个demo方便已经上传到了github上,可以clone下来直接看代码 https://github.com/IT0315/real-time-search.git 下面是demo运行的效果图 好了闲话不多说直接上代码 实时搜索 实时搜索通过触发input事件和定时器来实现 <input v-model="keyWords&quo

  • vue实现多组关键词对应高亮显示功能

    先上效果图: 我们有多组关键词,这里实现了关键词的背景色与匹配值的字体颜色值相同 先拟定一组数据 colors: [ "#FFB5C5", "#EEC900", "#D1EEEE", "#40E0D0", "#FFFF00", "#FF7F00", "#FF6A6A", "#B3EE3A", "#9F79EE", "#

  • vue实现搜索关键词高亮的详细教程

    目录 正文 解析 正则api——exec reg.exec执行 接下来看看执行具体的执行结果 提取关键字并分组 完整vue代码 正文 废话少说先上效果(左侧代码,右侧效果) 第一组 第二组 第三组 看到什么规律了吗? 没错!!这份代码就是依靠正则表达式来做出高亮效果,你负责传入str与reg,而函数则负责实现代码的高亮 解析 结构部分如下 <template> <div> <span :class="index%2!==0?'hightLight':''"

  • vue 动态给每个页面添加title、关键词和描述的方法

    前言:直接写html加title和关键词想必大家都知道怎么去加,但用vue框架开发的项目我们怎么去动态的给每个页面添加呢 ↓ 先在router.js里面配置我们的title.关键词和描述 { path: '/train', name: 'Train', component: () => import('../components/page/Train.vue'), meta: { title: '教师培训-恩启官网', content: { keywords: '教师培训.恩启培训.恩启云课堂.

  • vue中使用iview自定义验证关键词输入框问题及解决方法

    一.验证需求 对应配置的关键词输入框,验证要求如下: 1.总字数不能超过7000个: 2.去除配置的关键词特殊符号,得到的关键词组数不能超过300:(如:aaa&(bbb|ccc)|(!ddd|eee)),去掉特殊符号,有5组) 3.单个关键词长度不能超过20:(如:aaaaa&(bbb|ccc)),如果aaaaa长度超过20则提示) 二.解决方法 在关键词输入对应的FormItem中加入一个prop属性,作为验证字段使用:注意该FormItem是包含于Form的: form表单中添加ru

  • 如何使用Vue3实现文章内容中多个"关键词"标记高亮显示

    目录 写在开头 具体实现过程 基本使用 props 事件 原理过程 总结 写在开头 话说在某一天,小编正沉迷于掘金沸点中摸鱼,正起劲呢,产品小姐姐突然就跑过来,说时迟那时快,我一个闪电五连鞭,立马把屏幕切换成代码编辑器,绝不能让人看出我没需求了在摸鱼. 然后小姐姐巴拉巴拉讲了一堆,就是想加个"小"需求,小编当场就表现得很为难的样子. 十分正经温柔的对小姐姐说:"你看,我这还有需求没做完呢,分身乏术,再说你这个需求有点麻烦啊,没有一两周搞不定的". 但实际小编心中暗自

  • vue3单文件组件中style特性的深入讲解

    目录 style scoped style module 状态驱动的动态css 总结 style scoped 需要注意的有: 样式不会影响到其他组件,只会在当前组件生效. 子组件的根元素会同时 受父组件的作用域样式,和子组件的作用域样式影响. 这样做的目的是让父组件可以调整子组件的布局. 存在3个特殊的选择器: 1. 深度选择器:可以影响到子组件. 使用伪类 => :deep(cls: 影响的选择器) .a :deep(.b) { ... } 2. 插槽选择器: 可以影响到插槽内容的样式.使用

  • 使用 Vue3 实现文章目录功能

    前言 这一段时间一直在做一个博客项目 Kila Kila Blog,找了一圈发现没有特别满足自己需求的目录组件,所以决定自己动手,完成一个满足以下预期目标的目录组件: 自动高亮选中当前正在阅读的章节 自动展开当前正在阅读的章节的子标题,并隐藏其他章节的子标题 显示阅读进度 完成后的目录组件如下图左侧所示: 实现过程 由于标题之间有父子的关系,所以我们应该用树数据结构来解决这个问题.我们遍历文章容器中的所有标签,如果遇到 <h1>.<h2>这类标签,就创建一个节点,将其放到列表中,之

  • vue3父子组件传值中props使用细节浅析

    目录 setup函数的参数 一.父组件要给子组件传值时,可以通过props来完成组件的通信 二.子组件给父组件传值 总结 setup函数的参数 它主要有两个参数: 第一个参数:props :父组件传递过来的属性会被放到props对象中 第二个参数:context:包含3个属性 attrs:所有的非prop的attribute slots:父组件传递过来的插槽(这个在以渲染函数返回时会有作用,后面会讲到) emit:当我们组件内部需要发出事件时会用到emit 一.父组件要给子组件传值时,可以通过p

  • 详解如何在Vue3+TS的项目中使用NProgress进度条

    目录 写在前面 在项目中安装 简单的封装 在Vue切换路由时展示进度条 写在前面 NProgress是一个轻量级的进度条组件,在Github上已经2.4万star数了,虽然这个组件已经好久没有更新了,最近一次更新是20年4月份,改了jQuery的版本,但是该组件的使用频率还是高的. 在项目中安装 这里的包管理工具使用的npm,如果你使用的是yarn或者pnpm,请自行更改安装命令,安装命令如下: npm i nprogress -S 因为我们是TS的项目,还需要安装其类型声明文件,命令如下: n

  • vue3+ts实际开发中该如何优雅书写vue3语法

    目录 vue3语法的发展 优势 Composition Api类型约束 编译器宏 defineProps defineEmits defineExpose 总结 vue3语法的发展 Vue3 在早期版本( 3.0.0-beta.21 之前)中对 composition api 的支持,只能在组件选项 setup 函数中使用. 在 3.0.0-beta.21 版本中增加了 <script setup> 的实验特性.如果你使用了,会提示你 <script setup> 还处在实验特性阶

  • asp.net 文章内容分页显示的代码

    aspx: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ArticlePage.aspx.cs" Inherits="ArticlePage" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/

  • 文章内容页广告浮于左上角的解决办法

    这个是整页代码,你可以看着改了,也可以保存成HTML文件,完了试试看就知道了,主要用的CSS+DIV 上面的东西移到模板中,下面的东西也是一样~完了就行了~ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://

  • php实现获取文章内容第一张图片的方法

    本文实例讲述了php实现获取文章内容第一张图片的方法.分享给大家供大家参考.具体分析如下: 采用php获取文章内容的第一张图片方法非常的简单,我们最常用的是使用正则了,感兴趣的朋友可以参考一下下面这段代码. 以下是关于选取文章中第一张图片的代码: 复制代码 代码如下: $obj=M("News"); $info=$obj->where('id=1')->find(); //方法1********* $soContent = $info['content']; $soImag

  • Spring Boot2.0整合ES5实现文章内容搜索实战

    一.文章内容搜索思路 上一篇讲了在怎么在 Spring Boot 2.0 上整合 ES 5 ,这一篇聊聊具体实战.简单讲下如何实现文章.问答这些内容搜索的具体实现.实现思路很简单: 基于「短语匹配」并设置最小匹配权重值 哪来的短语,利用 IK 分词器分词 基于 Fiter 实现筛选 基于 Pageable 实现分页排序 这里直接调用搜索的话,容易搜出不尽人意的东西.因为内容搜索关注内容的连接性.所以这里处理方法比较 low ,希望多交流一起实现更好的搜索方法.就是通过分词得到很多短语,然后利用短

随机推荐