Vue3怎么实现文章内容中多个关键词标记高亮显示
具体实现过程
vue-word-highlighter 是一个小众的包,并不出名,Github 上也只会百星出头,不过能用能跑就行,合适才是最好的,小编最近信奉一句话"程序和你一个能跑就行"。
vue-word-highlighter
支持 Vue3
和 Vue2
,不过 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>) |
原理过程
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怎么实现文章内容中多个关键词标记高亮显示的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

想要实现页面的局部刷新,我们只需要实现局部组件(dom)的重新渲染。在Vue中,想要实现这一效果最简便的方式方法就是使用v-if指令。在Vue2中我们除了使用v-if指令让局部dom的重新渲染,也可以新建一个空白组件,需要刷新局部页面时跳转至这个空白组件页面,然后在空白组件内的beforeRouteEnter守卫中又跳转回原来的页面。如下图所示,如何在Vue3.X中实现点击刷新按钮实现红框范围内的dom重新加载,并展示对应的加载状态。由于Vue3.X中scriptsetup语法中组件内守卫只有o

tinymce是一个功能齐全的富文本编辑器插件,但在vue中引入tinymce并不像别的Vue富文本插件一样那么顺利,tinymce本身并不适配Vue,还需要引入@tinymce/tinymce-vue,并且它是国外的富文本插件,没有通过中文版本,需要在其官网下载翻译包(可能需要翻墙)。1、安装相关依赖npminstalltinymce-Snpminstall@tinymce/tinymce-vue-S2、下载中文包3.引入皮肤和汉化包在项目public文件夹下新建tinymce文件夹,将下载的

vue3+vite:src使用require动态导入图片报错和解决方法vue3+vite动态的导入多张图片vue3如果使用的是typescript开发,就会出现require引入图片报错,requireisnotdefined不能像使用vue2这样imgUrl:require(’…/assets/test.png’)导入,是因为typescript不支持require所以用import导入,下面介绍如何解决:使用awaitimport

Vue实现博客前端,需要实现markdown的解析,如果有代码则需要实现代码的高亮。Vue的markdown解析库有很多,如markdown-it、vue-markdown-loader、marked、vue-markdown等。这些库都大同小异。这里选用的是marked,代码高亮的库选用的是highlight.js。具体实现步骤如下:一、安装依赖库在vue项目下打开命令窗口,并输入以下命令npminstallmarked-save//marked用于将markdown转换成htmlnpmins

最终效果安装VueCropper组件yarnaddvue-cropper@next上面的安装值针对Vue3的,如果时Vue2或者想使用其他的方式引用,请访问它的npm官方地址:官方教程。在组件中引用使用时也很简单,只需要引入对应的组件和它的样式文件,我这里没有在全局引用,只在我的组件文件中引入import{userInfoByRequest}from'../js/api'import{VueCropper}from'vue-cropper&

前言无论是vue还是react,当遇到多处重复代码的时候,我们都会想着如何复用这些代码,而不是一个文件里充斥着一堆冗余代码。实际上,vue和react都可以通过抽组件的方式来达到复用,但如果遇到一些很小的代码片段,你又不想抽到另外一个文件的情况下,相比而言,react可以在相同文件里面声明对应的小组件,或者通过renderfunction来实现,如:constDemo:FC=({msg})=>{returndemomsgis{msg}}constApp:FC=()=>{return(

vue3+ts+axios+pinia实现无感刷新1.先在项目中下载aiXos和pinianpmipinia--savenpminstallaxios--save2.封装axios请求-----下载js-cookienpmiJS-cookie-s//引入aixosimporttype{AxiosRequestConfig,AxiosResponse}from"axios";importaxiosfrom'axios';import{ElMess

vue3项目打包发布到服务器后访问页面显示空白1、处理vue.config.js文件中的publicPath处理如下:const{defineConfig}=require('@vue/cli-service')module.exports=defineConfig({publicPath:process.env.NODE_ENV==='production'?'./':'/&
