精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

全文檢索與高亮關鍵詞匹配,用Replace就夠了

開發 前端
全文關鍵詞檢索高亮,這個在業務中常有的功能,比如瀏覽器默認就有個功能,關鍵詞搜索就會匹配你檢索的文字,并且會給你高亮,這是怎么實現的呢?

本文是一篇筆者關于replace API的筆記,希望看完在項目中有所思考和幫助。

正文開始...

在開始正文之前,主要是利用字符串replace這個API,你將要了解以下幾個知識。

1、字符串replace替換。

2、如何擴展elementUI組件源碼支持下拉框關鍵字搜索高亮。

3、正則匹配對應結果,replace高階用法。

了解需求

比如,現在一個常用的下拉框,我需要搜索關鍵詞模糊匹配,我們看下代碼。

<el-form-item label="愛好">
<el-select
v-model="condition.fv"
clearable
filterable
placeholder="請選擇愛好"
>
<el-option
v-for="(item, index) in favData"
:key="index"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<script>
export default {
data() {
return {
favData: [
'我喜歡籃球',
'我喜歡乒乓球',
'足球',
'游泳',
'跳水',
'aabbccaa',
'hello aa, test',
],
}
}
}
</script>

當我在el-select組件上添加filterable屬性后,就可以關鍵詞過濾了,但是只是過濾了,但是我想關鍵詞高亮。

你會發現el-select顯示的label并沒有提供插槽或者其他方式去自定義顯示label,源碼里是直接顯示的。

<!--https://github.com/ElemeFE/element/blob/dev/packages/select/src/option.vue-->
<template>
<li
@mouseenter="hoverItem"
@click.stop="selectOptionClick"
class="el-select-dropdown__item"
v-show="visible"
:class="{
'selected': itemSelected,
'is-disabled': disabled || groupDisabled || limitReached,
'hover': hover
}">
<slot>
<span>{{ currentLabel }}</span>
</slot>
</li>
</template>
<script>
export default {
name: 'ElOption',
computed: {
isObject() {
return Object.prototype.toString.call(this.value).toLowerCase() === '[object object]';
},
currentLabel() {
return this.label || (this.isObject ? '' : this.value);
},
}
</script>

我們嘗試修改擴展增強下這個option,于是想辦法去修改currentLabel,但是你會發現你想讓computed的currentLabel返回一個jsx貌似不太可能,因為渲染出來的會帶標簽,所以只能考慮重寫render方法。

重寫Option源碼

于是我們重寫render,新建一個extendElement.js。

// src/extendElement.js
// eslint-disable-next-line import/prefer-default-export
export const extendElemenUI = (ElementUI) => {
const { Option } = ElementUI;
// 重寫elementUI下拉框的Option,讓其支持模糊搜索關鍵字高亮
// eslint-disable-next-line no-unused-vars
Option.render = function (h) {
const { visible, itemSelected, disabled, groupDisabled, limitReached, selectOptionClick, hoverItem, currentLabel, hover, select: { query } } = this;
const setSlectClass = () => {
let str = 'el-select-dropdown__item';
if (itemSelected) {
str += ' selected';
}
if (disabled || groupDisabled || limitReached) {
str += ' is-disabled';
}
if (hover) {
str += ' hover';
}
return str;
};
return (visible ? <li
on-mouseenter={hoverItem}
on-click={selectOptionClick}
class={setSlectClass()}
>
<slot>
<span domPropsInnerHTML={hightText(currentLabel, query, 'all')}></span>
</slot>
</li > : null);
};
};

我們注意到我重寫了Option這個組件,我們在install安裝前就攔截這個組件,然后重寫了Option,主要是在ElementUI注冊前完成,jsx渲染標簽的關鍵在于domPropsInnerHTML這個接口,如果在模版中我們就是使用v-html去代替。

import Vue from 'vue';
import 'element-ui/lib/theme-chalk/index.css';
import ElementUI from 'element-ui';
import { installCustComponent } from '@/components';
import { extendElemenUI } from './extendElement';
import App from './App';
import router from './router';
import store from './store';
installCustComponent();
Vue.config.productionTip = false;
// 這里進行了擴展,主要是想擴展ElementUI不支持的功能,一定是在組件未注冊前進行攔截,重寫部分組件
extendElemenUI(ElementUI);
Vue.use(ElementUI);
/* eslint-disable no-new */
new Vue({
router,
store,
render: h => h(App),
}).$mount('#app');

我們發現在高亮關鍵字有用到這個hightText方法,主要支持關鍵詞全匹配與部分匹配,默認全匹配。

const hightText = (sourceStr, curentVal, reg = 'all') => {
if (curentVal === '') {
return sourceStr;
}
const ret = sourceStr.match(curentVal);
const hightStr = Array.isArray(ret) ? ret[0] : '';
if (reg) {
// 全匹配
return sourceStr.split(hightStr).reduce((prev, cur) => {
if (cur === '') {
prev.push(`<span class="hight" style="color: red;font-weight:bold">${hightStr}</span>`);
}
if (cur) {
prev.push(cur);
}
return prev;
}, []).join('');
}
return hightStr
? sourceStr.replace(
hightStr,
`<span class="hight" style="color: red;font-weight:bold">${hightStr}</span>`,
)
: `${sourceStr}`;
};

在上面的一塊代碼中我們發現,非全匹配,我們就用到了replace這個方法,主要是替換匹配到的關鍵字,但是這個replace我們結合match,我們發現無法重復匹配。

假設aabbccaa需要高亮aa,如果用不借助數組或者正則方式處理,我們使用的是replace字符串匹配的方式,那么一旦匹配到就結束,所以借助了數組的方式做了一點取巧實現了全檢索高亮。

看下最終的結果:

圖片

replace

replace高亮關鍵詞基本就已經完成這個需求功能,我們重新看下官方MDNreplace[1]的解釋。

replace()方法返回一個由替換值(replacement)替換部分或所有的模式(pattern)匹配項后的新字符串。模式可以是一個字符串或者一個[正則表達式](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp "正則表達式"),替換值可以是一個字符串或者一個每次匹配都要調用的回調函數。**如果pattern是字符串,則僅替換第一個匹配項。**

所以我們從這段解釋中可以發現,當我們使用replace替換,如果pattern是字符串,則僅替換第一個匹配項。

var sourceStr = 'aabbbccaa';
const ret = sourceStr.replace('aa', 111);
console.log(ret) // 111bbbccaa

但是我們發現匹配模式還可以是正則。

所以如果想全匹配,那么可以用正則來做。

var sourceStr = 'aabbbccaa';
const ret = sourceStr.replace(/aa/g, 111);
console.log(ret) // 111bbbcc111

所以我們也可以將我們上面的hightText方法改成下面這樣。

const hightText = (sourceStr, curentVal, reg = 'all') => {
if (curentVal === '') {
return sourceStr;
}
const ret = sourceStr.match(curentVal);
const hightStr = Array.isArray(ret) ? ret[0] : '';
const hightDom = text => `<span class="hight" style='color: red;font-weight:bold'>${text}</span>`;
if (hightStr) {
if (reg) {
// 全匹配
return sourceStr.replace(new RegExp(`${hightStr}`, 'ig'), hightDom(hightStr));
}
return sourceStr.replace(
hightStr, hightDom(hightStr),
);
}
return sourceStr;
};

官方的replace語法是這樣的str.replace(regexp|substr, newSubStr|function) 也就是說replace的第一個參數是字符串或者正則,第二個參數是字符串或者一個函數。

  • 字符串
var sourceStr = 'aabbbccaa';
const ret = sourceStr.replace('aa', 111);
console.log(ret) // 111bbbccaa
  • 正則
var sourceStr = 'aabbbccaa';
const ret = sourceStr.replace(/aa/ig, 111);
console.log(ret) // 111bbbcc111
  • 函數
const str = 'abc12345#$*%'
var newString = str.replace(/([^\d]*)(\d*)([^\w]*)/, function(match, $1, $2, $3, offset, string) {
console.log(match, offset, string)
return [$1, $2, $3]
});

我們看下第二次函數,對應的mactch與string是原數據,$1...$3是對應正則匹配的,如果我想把中間對應的數字換成其他的呢?

const str = 'abc12345#$*%'
var newString = str.replace(/([^\d]*)(\d*)([^\w]*)/, function(match, $1, $2, $3, offset, string) {
return $1.replace($1, '公眾號:') + $2.replace($2, 'Web技術學苑')+$3.replace($3, '-Maic')
});
console.log(newString) //公眾號:Web技術學苑-Maic

關于function的參數可以參考下面這個表

變量名

代表的值

match

匹配的子串。(對應于上述的 $&。)

$1,$2, ...

假如 replace() 方法的第一個參數是一個RegExp?[2] 對象,則代表第 n 個括號匹配的字符串。(對應于上述的 1,2 等。)例如,如果是用 ?/([^\d]*)(\d*)([^\w]*)/? 這個來匹配,$1? 就是匹配的 ([^\d]*)?,$2? 就是匹配的 (\d*),依次類推...

offset

匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是 'abcd'?,匹配到的子字符串是 'bc',那么這個參數將會是 1)

string

被匹配的原字符串。

在業務中你也會經??吹竭@樣的代碼:

var sourceStr = 'aabbbccaa';
const ret = sourceStr.replace(/aa/ig, 111).replace('bbb', 222);
console.log(ret) // 111222cc111'

replace調用返回的是一個新字符串,所以可以繼續調用replace方法,因為replace是掛載在String.prototype上的方法,所以所有字符串可以鏈式調用。

總結

  • 以一個實際例子,通過擴展el-select的Option組件實現高亮模糊關鍵字匹配與全匹配,不過這種方式有缺陷,無法根據當前組件有條件的選擇是否高亮匹配,因為我們是在注冊前重寫了render,這樣會導致所有下拉組件都會高亮模糊關鍵字。
  • 講解replace這個關鍵字函數,如果字符串替換就要知道這個API。
  • replace支持正則與字符串匹配,如果是字符串,則只會匹配首次,一旦匹配就成功替換,而正則可以做到全局匹配替換。
  • 關于replace第二個參數是回調函數的幾個參數的講解,當是回調函數時,第一個是match、string是原字符串,其余的$1,...$n是對應正則匹配的內容。
  • 本文示例code example[3]。

參考資料

[1]replace: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace

[2]RegExp: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp

[3]code example: https://github.com/maicFir/lessonNote/tree/master/vue/05-keep-alive

責任編輯:武曉燕 來源: Web技術學苑
相關推薦

2011-06-20 14:32:59

關鍵詞

2016-01-31 08:24:33

設計

2011-06-07 18:45:41

關鍵詞

2023-05-19 09:42:54

Chatbot

2011-06-14 19:11:38

關鍵詞

2013-09-17 15:23:02

華為HCC華為華為ICT

2013-08-26 15:43:40

AppStore關鍵詞開發者應用選取關鍵詞

2011-05-25 17:58:00

2011-05-25 17:38:56

關鍵詞

2019-12-22 13:48:26

退休科技行業大佬

2025-10-17 02:11:00

OllamaBGE-M3檢索

2017-01-10 10:37:31

2011-06-19 12:20:47

長尾關鍵詞

2012-03-20 22:19:16

Linux

2011-06-14 10:01:03

長尾關鍵詞

2011-07-22 15:48:46

SEO

2014-09-12 14:03:45

操作系統

2009-11-03 09:02:59

Windows 7蘋果競爭

2011-06-20 15:24:43

關鍵詞

2011-07-12 18:26:42

關鍵詞
點贊
收藏

51CTO技術棧公眾號

国产中文av在线| 精品一区二区中文字幕| 国产一区二区三区黄片| 综合天堂久久久久久久| 欧美成人官网二区| www.com毛片| 蜜芽在线免费观看| 国产精品一卡二卡| 欧洲精品毛片网站| 欧美激情精品久久久久久免费| 欧洲精品99毛片免费高清观看| 午夜伊人狠狠久久| 亚洲一区三区电影在线观看| 亚洲爱情岛论坛永久| 日韩—二三区免费观看av| 久久精品国产欧美亚洲人人爽| 中文视频在线观看| 欧美日韩卡一| 日韩欧美国产成人| 欧美黑人在线观看| 97超碰人人在线| 99精品视频在线播放观看| 国产日韩精品视频| 99精品人妻国产毛片| 中文字幕免费一区二区三区| 亚洲日韩中文字幕在线播放| 激情av中文字幕| 亚洲一区二区av| 色婷婷综合久久久久中文一区二区| 好色先生视频污| 成人午夜在线观看视频| 91亚洲男人天堂| 国产福利久久精品| 国产三级午夜理伦三级| 麻豆91精品视频| 国产成人拍精品视频午夜网站| 美女毛片在线观看| 欧美+日本+国产+在线a∨观看| 在线播放国产精品| 人妻精品久久久久中文字幕| 国产欧美三级电影| 精品国产一区二区三区不卡| 中文 日韩 欧美| 精品女同一区二区三区在线观看| 日韩欧美一区二区三区久久| 日韩五码在线观看| 99re6在线精品视频免费播放| 亚洲日本护士毛茸茸| 亚洲va韩国va欧美va精四季| 清纯唯美亚洲色图| 久久蜜臀中文字幕| 欧美二区三区| 免费一级毛片在线观看| 91欧美激情一区二区三区成人| 国精产品99永久一区一区| 国产视频在线观看视频| 国产一级精品在线| 亚洲综合精品一区二区| 国产成人精品av在线观| 国产一区欧美二区| 波多野结衣精品久久| 亚洲美女福利视频| 本田岬高潮一区二区三区| 国产伦精品一区二区三区高清| 成人乱码一区二区三区| av不卡一区二区三区| 九九99久久| 黄色视屏网站在线免费观看| 久久精品一区八戒影视| 欧美色欧美亚洲另类七区| 麻豆国产在线播放| 中文天堂在线一区| 国产经典久久久| 污污片在线免费视频| 亚洲成人久久影院| aa免费在线观看| 精品美女一区| 欧美变态tickling挠脚心| 性色av蜜臀av浪潮av老女人| 亚洲v天堂v手机在线| 亚洲色图狂野欧美| 欧美色视频一区二区三区在线观看| 我不卡影院28| 国模精品系列视频| 在线观看免费国产视频| 视频一区中文字幕| 91中文字幕在线| 天天操天天干天天操| 欧美经典三级视频一区二区三区| 亚洲精品一区国产精品| 免费毛片在线看片免费丝瓜视频| 午夜av区久久| 奇米影视四色在线| 在这里有精品| 亚洲欧美日韩中文在线| 欧美国产日韩在线观看成人| 国产午夜精品一区二区三区欧美 | 91精品国产一区二区三区| 国产免费无码一区二区| 国产精品亚洲片在线播放| 久久精品国产一区二区电影| 国产成人在线播放视频| 黄页网站大全一区二区| 国产在线精品一区二区三区》 | 成熟了的熟妇毛茸茸| 午夜不卡一区| 日韩第一页在线| 少妇高潮在线观看| 久久综合五月| 国产视频一区二区不卡| 黄色av电影在线播放| 一本色道久久综合狠狠躁的推荐| 日本中文字幕影院| 一区二区三区视频免费观看| 欧美成人中文字幕在线| 中文字幕人妻精品一区| av电影一区二区| 中文字幕在线中文| 欧美爱爱视频| 国产午夜精品全部视频在线播放| 精品一区二区三区四| 九九热在线视频观看这里只有精品| 久久精品成人一区二区三区蜜臀 | 亚洲欧美另类小说视频| 最新中文字幕2018| 国产一区二区精品福利地址| 97在线精品国自产拍中文| www久久久com| 亚洲图片你懂的| 中文字幕av专区| 欧美理论在线播放| 青青精品视频播放| 日韩在线免费看| 精品福利在线观看| 丰满少妇xbxb毛片日本| 亚洲视频在线免费| 成人免费视频网址| 日韩av中文| 欧美日韩在线亚洲一区蜜芽| 欧美熟妇激情一区二区三区| 日韩一级不卡| 精品国产综合| 性欧美18~19sex高清播放| 亚洲国内高清视频| 日韩精品乱码久久久久久| 成人黄色网址在线观看| 国产乱子伦精品无码专区| 日韩欧洲国产| 欧美另类暴力丝袜| 亚洲黄色在线播放| 亚洲sss视频在线视频| 波多野结衣三级视频| 亚洲视频一区| 精品一区二区不卡| 自拍网站在线观看| 亚洲日韩中文字幕在线播放| 国产美女www| 国产精品色一区二区三区| 污版视频在线观看| 久久久久久久久丰满| 91免费人成网站在线观看18| 自拍亚洲图区| 亚洲精品一线二线三线| 国产尤物在线视频| 国产色91在线| 国产欧美激情视频| 欧美日韩一区二区国产| 国产欧美丝袜| 婷婷激情一区| 俺也去精品视频在线观看| 国产精品视频一二区| 亚洲影视在线播放| 亚洲欧美色图视频| 免费av网站大全久久| 正在播放国产精品| 高清一区二区三区| 国产99视频精品免视看7| 日本不卡视频| 欧美精品一区二区三区蜜臀| 日韩欧美亚洲一区二区三区| 国产欧美精品日韩区二区麻豆天美| 可以看污的网站| 激情久久久久| 亚洲精品一区二区三区四区五区| 亚洲一区二区免费在线观看| 91av在线看| 黄色国产网站在线播放| 亚洲第一男人天堂| 在线观看毛片网站| 亚洲成人久久影院| 波多野结衣喷潮| 91网站在线播放| 在线免费观看av网| 亚洲主播在线| 国产成人生活片| 欧美欧美黄在线二区| 亚洲一区二区免费| 亚洲成人看片| 欧美精品videosex性欧美| 黄色国产在线| 亚洲电影成人av99爱色| 亚洲一区二区激情| 精品国产户外野外| 婷婷色中文字幕| 国产欧美日韩激情| 久久久国产精品无码| 狠狠色丁香婷综合久久| 欧美极品欧美精品欧美图片| 在线免费观看日本欧美爱情大片| 欧美一区二区三区成人久久片| 久久影院一区二区三区| 国产精品精品视频| 国产白浆在线免费观看| 蜜臀久久99精品久久久无需会员 | 亚洲色图38p| 尹人成人综合网| 福利在线小视频| 四虎8848精品成人免费网站| 久久伊人一区二区| 国产精品极品国产中出| 亚洲www在线| 日韩欧美激情| 国产精品久久久久久久电影| 亚洲黄色中文字幕| 97碰在线观看| 久久免费电影| 欧美日韩成人网| 黄色一级大片在线免费看产| 国产一区二区免费| 欧美美乳在线| 亚洲欧美国产日韩天堂区| 无码国精品一区二区免费蜜桃| 欧美一区二区黄| 国产女人18毛片水真多| 欧美裸体一区二区三区| 国产精品传媒在线观看| 色狠狠综合天天综合综合| 国产又爽又黄的视频| 婷婷开心激情综合| 日韩久久精品视频| 午夜精品成人在线视频| 国产精彩视频在线| 亚洲成人在线免费| 日本少妇裸体做爰| 精品国产成人av| 国产婷婷色一区二区在线观看| 欧美视频国产精品| 无码人妻久久一区二区三区| 色狠狠综合天天综合综合| 波多野结衣mp4| 欧美在线啊v一区| 中文字幕自拍偷拍| 欧美精品在线观看播放| 中文字幕男人天堂| 在线观看91av| 亚洲av无码片一区二区三区| 精品久久久久99| 十八禁一区二区三区| 日韩成人小视频| 国际av在线| 精品国模在线视频| 亚洲男同gay网站| 国模gogo一区二区大胆私拍| 美女高潮在线观看| 国产精品电影在线观看| 欧美亚洲二区| 97伦理在线四区| 日韩三级av| 亚洲日本精品| 国模 一区 二区 三区| 国产午夜大地久久| 视频一区二区不卡| 日韩av自拍偷拍| 成人激情校园春色| 精品人妻一区二区三区四区| 中文字幕亚洲成人| 日本少妇激情舌吻| 欧美日韩你懂得| 成人午夜福利视频| 亚洲欧美日韩中文视频| 国产美女av在线| 97色在线视频观看| 久久精品国产福利| 国产乱码精品一区二区三区日韩精品 | 女女同性女同一区二区三区91| 欧美三级三级| 成人在线视频一区二区三区| 免播放器亚洲| 一二三级黄色片| 97se狠狠狠综合亚洲狠狠| 特级西西人体高清大胆| 亚洲国产精品自拍| 夜夜爽8888| 日韩黄色av网站| 成人高清免费在线| 国产精品96久久久久久| 中文无码日韩欧| 亚洲精品一卡二卡三卡四卡| 亚洲国产精品第一区二区| 第四色婷婷基地| 91香蕉视频污在线| 黑人巨大精品一区二区在线| 色婷婷av一区二区三区大白胸| 精品国产黄色片| 在线观看中文字幕亚洲| 狠狠躁少妇一区二区三区| 国产日韩中文字幕| 国内黄色精品| 国产视频一视频二| 国产成人午夜精品5599| 国产馆在线观看| 一本大道av一区二区在线播放| 亚洲第一页视频| 久久韩剧网电视剧| 亚洲a∨精品一区二区三区导航| 国产精品露出视频| 一区二区三区在线电影| 国产精品久久久毛片| 91蝌蚪porny九色| 日本熟妇乱子伦xxxx| 日韩午夜激情免费电影| 青青青青在线| 国产精品日日做人人爱 | 日本不卡一区二区三区四区| 久久精品日产第一区二区 | 午夜久久久久久久久久| 菠萝蜜影院一区二区免费| 韩日精品一区| 精品国产网站地址| 日韩三级视频在线| 欧美三级中文字幕| 精品av中文字幕在线毛片| 136fldh精品导航福利| 高清一区二区三区| 无码粉嫩虎白一线天在线观看| 国产一区二区剧情av在线| 99久久久无码国产精品不卡| 欧美性受xxxx| yw在线观看| 国产精品视频yy9099| 欧美三级三级| 日本免费色视频| 亚洲天堂免费在线观看视频| 亚洲无码久久久久久久| 日韩在线观看免费全| 色噜噜成人av在线| 国产三级中文字幕| 国产一区二区精品久久99| 日本精品人妻无码77777| 91精品视频网| 欧美韩日亚洲| 国内一区二区在线视频观看| 宅男噜噜噜66一区二区 | 好吊妞视频这里有精品| 日本午夜激情视频| 26uuu国产电影一区二区| 人妻 日韩精品 中文字幕| 伊人久久久久久久久久久久久| 午夜av成人| 天天操天天干天天玩| 国产成人av电影在线播放| av资源吧首页| 亚洲色图美腿丝袜| а天堂中文最新一区二区三区| 中文字幕の友人北条麻妃| 成人免费黄色大片| 一级成人黄色片| 日韩一区视频在线| 51亚洲精品| 欧美激情国产精品日韩| 国产精品国产三级国产普通话99| 99久久99久久久精品棕色圆| 久久久久久国产| 欧美人与物videos另类xxxxx| 午夜久久久精品| 一区二区三区产品免费精品久久75| 国产成人自拍一区| 国产精品pans私拍| 一区二区电影在线观看| 国产精品久久AV无码| 91精品福利视频| 新版中文在线官网| 欧美精品一区二区三区在线四季| 久久99精品久久只有精品| 国产无套在线观看| 最近更新的2019中文字幕| 一区三区自拍| wwwwxxxx日韩| 一区二区三区91| 搞黄视频免费在线观看| 99久久精品久久久久久ai换脸| 日韩在线观看一区二区| 色哟哟一一国产精品| 日韩精品在线观看网站| 亚洲精品毛片| 鲁一鲁一鲁一鲁一色| 亚洲免费观看高清在线观看| 男人的天堂在线视频| 999国产在线| 奇米四色…亚洲|