最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue實現(xiàn)搜索關(guān)鍵詞高亮的詳細(xì)教程

 更新時間:2022年07月26日 17:11:39   作者:Monday1997  
這篇文章主要為大家介紹了vue實現(xiàn)搜索關(guān)鍵詞高亮的詳細(xì)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

廢話少說先上效果(左側(cè)代碼,右側(cè)效果)

  • 第一組

  • 第二組

  • 第三組

看到什么規(guī)律了嗎?

沒錯??!這份代碼就是依靠正則表達(dá)式來做出高亮效果,你負(fù)責(zé)傳入str與reg,而函數(shù)則負(fù)責(zé)實現(xiàn)代碼的高亮

解析

結(jié)構(gòu)部分如下

<template>
  <div>
    <span
      :class="index%2!==0?'hightLight':''"
      v-for="(item,index) in textData"
      :key="index"
    >{{item}}</span>
  </div>
</template>

基本原理就是將傳入的str按照正則的規(guī)則進(jìn)行切割,偶數(shù)部分負(fù)責(zé)高亮,奇數(shù)部分負(fù)責(zé)正常顯示

如:

str與reg分別為

let str = "高亮幾個詞語出來好不好";
let reg = /(高亮|詞語)/g;

將該部分切割為如下數(shù)組

"高亮幾個詞語出來好不好" ---》 ['', '高亮', '幾個', '詞語', '出來好不好'] ----》

知道了基本原理,我們再來看一下代碼

      let str = "高亮幾個詞語出來好不好";
      let reg = /(高亮|詞語)/g;
      let result = {};
      let currentIndex = 0, returnData = [];
      while ((result = reg.exec(str))) {
        returnData.push(str.slice(currentIndex, result.index));
        returnData.push(result[1]);
        currentIndex = result.index + result[0].length;
      }
      if (str.length &gt; currentIndex) {
        returnData.push(str.slice(currentIndex, str.length));
      }
      console.log(returnData);
      this.textData = returnData;

代碼關(guān)鍵在于理解reg.exec,了解這個api的可以直接跳到提取關(guān)鍵字并分組

正則api——exec

理解了這個例子,也就基本理解了其他的例子

我們這樣規(guī)定,將被兩個#和一個空格包圍的內(nèi)容進(jìn)行高亮即## 內(nèi)容 ##時,內(nèi)容要被提取出來并高亮,首先要對其進(jìn)行分組

"1212## 4455 #### 0011 ##44488## 000000 ##"就會被分為

['1212', '4455', '', '0011', '44488', '000000'] 高亮文本與普通文本間隔排序

先來看看下面這部分代碼

let str = "1212## 4455 #### 0011 ##44488## 000000 ##";
let reg = /##\s+(.*?)\s+##/g;
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));

執(zhí)行結(jié)果如下

reg.exec執(zhí)行

  • 第一次的時候會從字段中找到第一個匹配的字段(## 4455 ##),
  • 第二次:會在第一次匹配的位置后找到第二個匹配的字段(## 0011 ##),
  • 第三次:會在第二次匹配的位置后找到第三個匹配字段(## 000000 ##)
  • 第四次時,剩余的字符已經(jīng)沒有了匹配所有返回null

也就是說,在null之后的執(zhí)行結(jié)果,都是循環(huán)之前的執(zhí)行結(jié)果,所以咱們在執(zhí)行結(jié)果為null時即可停止

接下來看看執(zhí)行具體的執(zhí)行結(jié)果

0: "## 4455 ##"
1: "4455"
groups: undefined
index: 4
input: "1212## 4455 #### 0011 ##44488## 000000 ##"
length: 2

返回的是一個數(shù)組,并帶有幾個字段屬性

結(jié)合一下其正則'0'是拿匹配到正則規(guī)則的值,'1'則是匹配到在正則里第一個被括號包起來的值

,這個lenth你可以粗糙的理解為需要提取的(即有幾個括號)數(shù)量+1(這個指的是能匹配到的整體)

至于為什么是一樣的還要用括號括起來,這個后面會說

知道原理之后我們來看看如何提取關(guān)鍵字并分組

提取關(guān)鍵字并分組

提取關(guān)鍵字并分組 首先我們清楚的看到,通過正則,他會給出三個有用的信息

第一個是匹配到的正則規(guī)則中的值

第二個是可以拿到我們想要提取出來 即用括號括起來的值

第三個是該值所在的index

我們一步一步來

分成這種結(jié)構(gòu),

也就是每次exec執(zhí)行不為null時都做一次區(qū)分, 將匹配到的值前方位置提取作為普通字符串,再把當(dāng)前的關(guān)鍵字提取作為高亮字符串,如下:

比如第一次匹配時,拿到的值是這樣的

  • 第二次匹配
/*
0: "## 4455 ##"
1: "4455"
groups: undefined
index: 4
input: "1212## 4455 #### 0011 ##44488## 000000 ##"
length: 2
*/

這里index為4,將下標(biāo)為0-4的字符提取為普通數(shù)組,而匹配到的字符串4455作為高亮字符

此時數(shù)組為['1212','4455']

  • 第二次匹配
0: "## 0011 ##"
1: "0011"
groups: undefined
index: 14
input: "1212## 4455 #### 0011 ##44488## 000000 ##"
length: 2

普通字符串應(yīng)下標(biāo)為為14-14即空字符串,高亮字符為匹配到的0011

此時數(shù)組為['','0011']

這里需要明確兩個14分別是怎么來的

第一個14是上一次匹配返回值的 index+上次匹配到字符串字符串## 4455 ##的長度

第二個14是本次配到的index,

可能這時還有點懵,看這最后一次匹配,你應(yīng)該就理解了

  • 第三次匹配
0: "## 000000 ##"
1: "000000"
groups: undefined
index: 29
input: "1212## 4455 #### 0011 ##44488## 000000 ##"
length: 2

普通字符串應(yīng)是下標(biāo)為24-29即44488,高亮字符為000000

此時數(shù)組為['44488','000000']

同樣需要明確24,29分別是怎么來的

第一個是上一次匹配返回值的 index+上次匹配到字符串### 0011 ##的長度

第二個則是本次匹配到的index 29

至此 我們用一個while循環(huán)將其包裹,利用上面的規(guī)則把對應(yīng)的值push到數(shù)組中,并用一個值緩存上一次的index就可以得到我們的目標(biāo)數(shù)組

	  let str = "1212## 4455 #### 0011 ##44488## 000000 ##";
      let reg = /##\s+(.*?)\s+##/g;
      let result = {};
      let currentIndex = 0,
        returnData = [];
      while ((result = reg.exec(str))) {
        console.log(result);
        returnData.push(str.slice(currentIndex, result.index));
        returnData.push(result[1]);
        currentIndex = result.index + result[0].length;
      }
	  // 最后一次匹配的高亮詞后可能還有沒push到數(shù)組中的值
      if (str.length > currentIndex) {
        returnData.push(str.slice(currentIndex, str.length));
      }
      console.log(returnData);  // ['1212', '4455', '', '0011', '44488', '000000']
      this.textData = returnData;

完整vue代碼

<template>
  <div>
    <span
      :class="index%2!==0?'hightLight':''"
      v-for="(item,index) in textData"
      :key="index"
    >{{item}}</span>
  </div>
</template>
<script>
export default {
  data() {
    return {};
  },
  created() {
    this.init();
  },
  methods: {
    init() {
      // let str = "實現(xiàn)搜索詞高亮 - 百度文庫";
      // let reg = /([高亮詞文])/g;
      // let str = "高亮幾個詞語出來好不好";
      // let reg = /(高亮|詞語)/g;
      let str = "1212## 4455 #### 0011 ##44488## 000000 ##";
      let reg = /##\s+(.*?)\s+##/g;
      let result = {};
      let currentIndex = 0,
        returnData = [];
      while ((result = reg.exec(str))) {
        console.log(result);
        returnData.push(str.slice(currentIndex, result.index));
        returnData.push(result[1]);
        currentIndex = result.index + result[0].length;
      }
      if (str.length > currentIndex) {
        returnData.push(str.slice(currentIndex, str.length));
      }
      console.log(returnData);
      this.textData = returnData;
    }
  }
};
</script>
<style>
.hightLight {
  color: red;
}
</style>

以上就是vue實現(xiàn)搜索關(guān)鍵詞高亮的詳細(xì)教程的詳細(xì)內(nèi)容,更多關(guān)于vue搜索關(guān)鍵詞高亮的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • element UI 中的 el-tree 實現(xiàn) checkbox 單選框及 bus 傳遞參數(shù)功能

    element UI 中的 el-tree 實現(xiàn) checkbox&n

    在日常項目開發(fā)中,會經(jīng)常遇到,樹形結(jié)構(gòu)的查詢方式,為了快速方便開發(fā),常常會使用到快捷的ui組件去快速搭樹形結(jié)構(gòu),這里我用的是 element ui 中的 el-tree,對element UI 中的 el-tree 實現(xiàn) checkbox 單選框及 bus 傳遞參數(shù)的方法感興趣的朋友跟隨小編一起看看吧
    2022-09-09
  • Vue2實現(xiàn)組件延遲加載的示例代碼

    Vue2實現(xiàn)組件延遲加載的示例代碼

    當(dāng)一個頁面需要加載較多個組件時,并且組件自身又比較復(fù)雜,如果一次性加載,可能等待時間較長,體驗不好,這個時候就需要延遲加載了,本文為大家介紹了Vue2實現(xiàn)組件延遲加載的示例代碼,需要的可以參考下
    2024-01-01
  • vue中使用/deep/失效的解決方法

    vue中使用/deep/失效的解決方法

    這篇文章主要介紹了vue中使用/deep/失效的解決辦法,使用了css預(yù)處理器,則可以使用/deep/, 如果/deep/ 無效,則使用 ::v-deep,本文給大家講解的非常詳細(xì)需要的朋友可以參考下
    2022-11-11
  • vue 添加vux的代碼講解

    vue 添加vux的代碼講解

    通過命令npm install vux --save添加vux,在相關(guān)配置文件中配置信息,具體代碼添加方法,大家參考下本文
    2017-11-11
  • 詳解Vue中如何實現(xiàn)圖片處理與濾鏡效果

    詳解Vue中如何實現(xiàn)圖片處理與濾鏡效果

    Vue.js作為一個靈活的JavaScript框架,可以很容易地與圖像處理庫和濾鏡效果庫集成,以實現(xiàn)各種圖像處理需求,下面我們就來學(xué)習(xí)一下vue是如何實現(xiàn)圖片處理與濾鏡效果的吧
    2023-10-10
  • Vue?3.0?中?hooks?的概念示例詳解

    Vue?3.0?中?hooks?的概念示例詳解

    在Vue3.0框架中,hooks函數(shù)允許將組件邏輯抽離復(fù)用,提高代碼的可維護(hù)性和復(fù)用性,通過封裝邏輯如獲取數(shù)據(jù)、處理狀態(tài)等,hooks使得組件開發(fā)更加高效和清晰,示例中,useDog.ts用于獲取狗狗圖片,展示了hooks封裝數(shù)據(jù)和邏輯、響應(yīng)式數(shù)據(jù)和異步操作的能力
    2024-10-10
  • 關(guān)于Vue實現(xiàn)組件信息的緩存問題

    關(guān)于Vue實現(xiàn)組件信息的緩存問題

    這篇文章主要介紹了關(guān)于Vue實現(xiàn)組件信息的緩存問題的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • vue?當(dāng)中組件之間共享數(shù)據(jù)的實現(xiàn)方式

    vue?當(dāng)中組件之間共享數(shù)據(jù)的實現(xiàn)方式

    這篇文章主要介紹了vue?當(dāng)中組件之間共享數(shù)據(jù)的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue.js如何將echarts封裝為組件一鍵使用詳解

    vue.js如何將echarts封裝為組件一鍵使用詳解

    Echarts 、 Remodal和Pikaday是我們在開發(fā)后臺管理類網(wǎng)站時常用的三個第三方組件,下面這篇文章主要給大家介紹了關(guān)于vue.js如何將echarts封裝為組件一鍵使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-10-10
  • axios簡單實現(xiàn)小程序延時loading指示

    axios簡單實現(xiàn)小程序延時loading指示

    這篇文章主要介紹了axios簡單實現(xiàn)小程序延時loading指示,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07

最新評論

平塘县| 林州市| 乐平市| 平和县| 抚顺市| 麻阳| 许昌县| 黄冈市| 远安县| 岱山县| 枣强县| 汝城县| 伽师县| 高要市| 专栏| 石家庄市| 沛县| 怀化市| 栖霞市| 旬阳县| 开原市| 奎屯市| 吉林省| 乌海市| 乌审旗| 永川市| 岐山县| 曲松县| 麻江县| 叙永县| 兰考县| 凤城市| 怀集县| 阿瓦提县| 枣强县| 望城县| 仙居县| 赤水市| 灌云县| 如东县| 阳东县|