如何使用Vue3實(shí)現(xiàn)文章內(nèi)容中多個(gè)"關(guān)鍵詞"標(biāo)記高亮顯示
寫在開頭
話說(shuō)在某一天,小編正沉迷于掘金沸點(diǎn)中摸魚,正起勁呢,產(chǎn)品小姐姐突然就跑過(guò)來(lái),說(shuō)時(shí)遲那時(shí)快,我一個(gè)閃電五連鞭,立馬把屏幕切換成代碼編輯器,絕不能讓人看出我沒(méi)需求了在摸魚。
然后小姐姐巴拉巴拉講了一堆,就是想加個(gè)"小"需求,小編當(dāng)場(chǎng)就表現(xiàn)得很為難的樣子。
十分正經(jīng)溫柔的對(duì)小姐姐說(shuō):"你看,我這還有需求沒(méi)做完呢,分身乏術(shù),再說(shuō)你這個(gè)需求有點(diǎn)麻煩啊,沒(méi)有一兩周搞不定的"。
但實(shí)際小編心中暗自竊喜,這需求不難,一個(gè)小時(shí)能搞定,多一秒都算我輸(?ω?)。
不過(guò)職場(chǎng)的"人情世故"咱得懂,低調(diào)行事,多給自己爭(zhēng)取一點(diǎn)摸魚時(shí)間。
小姐姐:"行吧,你盡快做就行,需求也不是很趕"。
這波又成功忽悠了一些摸魚時(shí)間,當(dāng)然,主要還是公司業(yè)務(wù)一直都是不緊不慢,找公司還得找這種的,公司業(yè)務(wù)不急,不加班,產(chǎn)品好說(shuō)話,不投毒,這就是我的夢(mèng)中情司。
好了好了,稍微廢話了一下,咱回歸正題來(lái)介紹一下具體需求,需求大概過(guò)程就是"把一篇文章的關(guān)鍵字標(biāo)記高亮顯示",你沒(méi)聽錯(cuò),就是這么簡(jiǎn)單。
當(dāng)然,具體還有一些小細(xì)節(jié):
- 關(guān)鍵字由后端接口返回,會(huì)有多個(gè)關(guān)鍵字。
- 關(guān)鍵字不區(qū)分大小寫。
- 統(tǒng)計(jì)關(guān)鍵字在文中的個(gè)數(shù)。
- 高亮樣式需要使用UI提供的樣式。
- ...
具體實(shí)現(xiàn)過(guò)程
以上這個(gè)需求,其實(shí)本質(zhì)就是瀏覽器的搜索功能,也算是一個(gè)比較常見的功能了,記得在 Vue2 有很多插件包可以來(lái)快速實(shí)現(xiàn)這個(gè)功能。奈何小編的項(xiàng)目是 Vue3+TS 的(︶︹︺),不過(guò)網(wǎng)上"輪子"很多,經(jīng)過(guò)小編的一頓搜索尋找,果然就找到一個(gè)插件挺符合我的需要,下面就來(lái)稍微介紹介紹它。
vue-word-highlighter 是一個(gè)小眾的包,并不出名,Github 上也只會(huì)百星出頭,不過(guò)能用能跑就行,合適才是最好的,小編最近信奉一句話"程序和你一個(gè)能跑就行"。
vue-word-highlighter 支持 Vue3 和 Vue2,不過(guò) Vue2 版本是通過(guò) vue-demi 構(gòu)建的,對(duì) vue-demi 不熟悉的小伙伴還是別用吧(?ω?),咱有一說(shuō)一,用 Vue2 來(lái)完成該需求,有其他很多包可以推薦。
至于為什么,正如它文檔介紹的:

基本使用
它的使用比較簡(jiǎn)單的,直接上代碼:
<template>
<div>
<input v-model="searchValue" />
<button @click="search">search</button>
<div>搜索到的個(gè)數(shù):{{result.length}}</div>
<div>搜索到的內(nèi)容:{{result}}</div>
<br/>
<WordHighlighter
highlightClass="highlight"
:query="lightQuery"
:caseSensitive="false"
:splitBySpace="true"
@matches="lightEmit">
<div>
我已經(jīng)遠(yuǎn)離了你的河流,絕不是疏遠(yuǎn),因?yàn)槲乙咽巧砭赢愅?。遠(yuǎn)遠(yuǎn)地,依然聽得到你翻山越嶺、日夜兼程的腳步聲,依然無(wú)比清晰地看得到你的那條灑滿星星的清澈的河流。只要,也只有想起你——故鄉(xiāng),就是異域的那條河流也會(huì)灑滿故鄉(xiāng)的星星。無(wú)論醒著還是沉睡,都會(huì)重復(fù)著那個(gè)讓人心旌搖曳的畫面,星星都在你的河流里百媚地眨眼。因?yàn)槟菞l灑滿星星的河流途經(jīng)我無(wú)猜的孩童,無(wú)知的少年,迷茫的青春,還要經(jīng)過(guò)可知的未來(lái),是不是今后還要交付給大海了呢?那樣,大海的那些星星一定是故鄉(xiāng)送給他們的饋贈(zèng),沒(méi)有故鄉(xiāng)的孕育,大海也會(huì)失去靈氣,因?yàn)榇蠛5脑搭^就在故鄉(xiāng)的這頭……
星星的感情,在城市里總是被耽誤。是星星的感情單一,還是城市的濫情呢?如果城市是舞臺(tái),星星就不是市民,所以也不是演員。如果天空是舞臺(tái),星星就是居民,所以能成為明星。如果河流是舞臺(tái),星星就是精靈,她就是大地的靈魂。如今,愛(ài)情在城市里就是一個(gè)錯(cuò)誤,比金錢的質(zhì)量輕百倍,所以比海洛因更危險(xiǎn)。愛(ài)情在鄉(xiāng)村的河流里,就有了星星的光輝,成就的是??菔癄€的傳奇……
晴空萬(wàn)里的白晝,總愛(ài)涂脂抹粉打扮一番。這樣的時(shí)候,只有清泉敢從濃妝艷抹的云端踏過(guò),只有披著滿身星星的魚兒敢從藍(lán)天穿過(guò),將自滿表現(xiàn)的太陽(yáng)戲弄一番。漿洗的女人們總愛(ài)把笑聲拋在河面上,拍打著棒槌當(dāng)爵士樂(lè)的節(jié)拍,委婉的歌聲隨著幸福的河水流淌,斑斕的衣服在白云間飄舞成了彩虹。我聽到了大地與天空的竊語(yǔ),徹底悟出了薩頂頂唱的《萬(wàn)物生》里的深刻與凝重:我看見山鷹在寂寞兩條魚上飛 ,兩條魚兒穿過(guò)海一樣咸的河水, 一片河水落下來(lái)遇見人們破碎 ,人們?cè)谛凶?,身上落滿山鷹的灰……
睡得沉沉的夜,呵欠連連,漫長(zhǎng)得沒(méi)有盡頭,無(wú)論夜幾多的黑,可故鄉(xiāng)的河流從也不會(huì)迷路,因?yàn)橛行切沁@明亮的眼睛。你的人生沒(méi)有迷路,你的夢(mèng)沒(méi)有迷失方向,你的未來(lái)總在奔跑的路上,是不是也是借了故鄉(xiāng)河流里的星星做慧眼呢?如果河流看不到星星,那肯定會(huì)落魄的。如果人生看不到那條飄著星星的河流,如果夢(mèng)里沒(méi)有那條飄著星星的河流,如果未來(lái)的路上沒(méi)有那條飄著星星的河流,你是不是都會(huì)驚慌失措呢?陌生人能通過(guò)那條河流找到你的家,如果沒(méi)有了她你的心能到家嗎?
</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>
是不是超簡(jiǎn)單,下面貼一下它支持的一些 props 與事件,就又可以愉快的摸魚了。
props
| 參數(shù) | 類型 | 默認(rèn)值 | 說(shuō)明 |
|---|---|---|---|
| query | String or RegExp | - | 搜索內(nèi)容。 |
| caseSensitive | Boolean | false | 是否區(qū)分大小寫。 |
| diacriticsSensitive | Boolean | false | 是否區(qū)分變音符號(hào),如 u 和 ü。 |
| splitBySpace | Boolean | false | 是否用空格分割字符串以使其成為搜索字符串,如果設(shè)置為false,則默認(rèn)把搜索內(nèi)容當(dāng)成一個(gè)整體進(jìn)行搜索;當(dāng) query 為正則時(shí),splitBySpace 默認(rèn)為 false。 |
| highlightTag | String | <mark /> | 標(biāo)記搜索到的內(nèi)容所包裹的標(biāo)簽。 |
| highlightClass | String or Object or Array | - | 給標(biāo)記的內(nèi)容添加 class,綁定語(yǔ)法類似于 vue 。 |
| highlightStyle | String or Object or Array | - | 同上 。 |
| wrapperTag | String | <span /> | 整個(gè)目標(biāo)搜索區(qū)的容器標(biāo)簽。 |
| wrapperClass | String or Object or Array | - | 給目標(biāo)搜索區(qū)的容器添加 class,綁定語(yǔ)法類似于 vue 。 |
| textToHighlight | String | v-slot:default | 目標(biāo)搜索區(qū)的內(nèi)容。 |
事件
| 事件名稱 | 說(shuō)明 | 回調(diào)參數(shù) |
|---|---|---|
| matches | query 參數(shù)變化時(shí)觸發(fā),函數(shù)返回搜索到的內(nèi)容 | function(value:Array<String>) |
原理過(guò)程
等等!??!你以為到這里就完了嗎?肯定還沒(méi)啦。
作為一名技術(shù)人,我們需要知曉其中的原理過(guò)程才算合格唷。
小編認(rèn)真翻了一下 vue-word-highlighter 的源碼,整體源碼內(nèi)容就百來(lái)行代碼而已,不算太多,這里我們就不一點(diǎn)點(diǎn)講解了,小編寫個(gè)核心方法保準(zhǔn)你能懂(不懂來(lái)打我呀,略略略)。
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;
}好了,到此結(jié)束,繼續(xù)摸魚了。
總結(jié)
到此這篇關(guān)于如何使用Vue3實(shí)現(xiàn)文章內(nèi)容中多個(gè)"關(guān)鍵詞"標(biāo)記高亮顯示的文章就介紹到這了,更多相關(guān)Vue3關(guān)鍵詞標(biāo)記高亮顯示內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vant組件表單外部的button觸發(fā)form表單的submit事件問(wèn)題
這篇文章主要介紹了vant組件表單外部的button觸發(fā)form表單的submit事件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
vue-router4版本第一次打開界面不匹配路由問(wèn)題解決
本文主要介紹了vue-router4版本第一次打開界面不匹配路由問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
ElementUI日期選擇器時(shí)間選擇范圍限制的實(shí)現(xiàn)
在日常開發(fā)中,我們會(huì)遇到一些情況,限制日期的范圍的選擇,本文就詳細(xì)的介紹了ElementUI日期選擇器時(shí)間選擇范圍限制的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),感興趣的可以了解一下2022-04-04
vue中遇到的坑之變化檢測(cè)問(wèn)題(數(shù)組相關(guān))
這篇文章主要介紹了vue中遇到的坑之變化檢測(cè)問(wèn)題(數(shù)組相關(guān)) ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
vue3組合式api實(shí)現(xiàn)v-lazy圖片懶加載的方法實(shí)例
vue作為前端主流的3大框架之一,目前在國(guó)內(nèi)有著非常廣泛的應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于vue3組合式api實(shí)現(xiàn)v-lazy圖片懶加載的相關(guān)資料,需要的朋友可以參考下2022-09-09
element動(dòng)態(tài)路由面包屑的實(shí)現(xiàn)示例
本文主要介紹了element動(dòng)態(tài)路由面包屑的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Vue實(shí)現(xiàn)路由跳轉(zhuǎn)的3種方式超詳細(xì)分解
Vue.js是一款流行的前端JavaScript框架,它提供了多種方式來(lái)實(shí)現(xiàn)路由跳轉(zhuǎn),下面這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)路由跳轉(zhuǎn)的3種方式,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12

