精品欧美一区二区三区在线观看 _久久久久国色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在线加勒比| 欧美熟妇交换久久久久久分类| 国产成人黄色| 欧美日韩综合在线| 黄色片免费在线观看视频| 无码精品一区二区三区在线| 日日夜夜免费精品视频| 久久综合伊人77777蜜臀| 91黄色免费视频| 99精品在免费线偷拍| 一区二区三区色| 久久亚裔精品欧美| 国产欧美综合视频| 另类图片国产| 欧美激情视频一区二区| 成人小视频免费看| 亚洲一区二区三区免费| 欧美性生活影院| 欧日韩免费视频| 欧美激情二区| 久久综合给合久久狠狠狠97色69| 91亚洲精品久久久久久久久久久久| 日韩伦理在线视频| 91精品久久久久久久蜜月| 亚洲精品自拍第一页| 天堂av2020| 欧美日韩激情电影| 精品magnet| 日韩精品免费一区| 无遮挡动作视频在线观看免费入口| va亚洲va日韩不卡在线观看| 92看片淫黄大片欧美看国产片| 欧美日韩综合一区二区三区| 伊人久久综合| 欧美美最猛性xxxxxx| 2017亚洲天堂| 国产免费av一区二区三区| 精品不卡在线视频| 亚洲欧美激情一区二区三区| 日韩免费在线电影| 欧美特级限制片免费在线观看| 自拍日韩亚洲一区在线| 美洲精品一卡2卡三卡4卡四卡| 国产精品你懂的在线欣赏| 欧美大香线蕉线伊人久久国产精品| 国产小视频免费观看| 韩国精品一区二区| 国产日韩在线观看av| 波多野结衣家庭主妇| 欧美中文日韩| 日本91av在线播放| 69亚洲精品久久久蜜桃小说| 99这里有精品| 45www国产精品网站| 日韩熟女精品一区二区三区| 韩国av一区| 久久免费福利视频| 国产真实乱偷精品视频| 国内久久视频| 97国产精品久久| 日本一级一片免费视频| av不卡免费看| 国产91九色视频| 无码人妻精品一区二区三区蜜桃91 | 欧美在线小视频| 一区二区在线播放视频| 精品国模一区二区三区| 欧美少妇bbb| 天天摸天天舔天天操| 精品国产亚洲一区二区三区在线| 制服视频三区第一页精品| 亚洲一级片免费观看| 中文字幕亚洲在线观看| 亚洲第一福利网站| 手机av免费看| 日韩欧美高清在线播放| 欧美大成色www永久网站婷| 免费一级a毛片夜夜看 | 久久久久国产一区二区三区| 日本一二三区不卡| 久久精品中文| 成人国产精品一区| 亚洲奶汁xxxx哺乳期| 99精品视频一区| 五月婷婷综合色| 中国av在线播放| 精品成人乱色一区二区| 一本色道久久亚洲综合精品蜜桃| 成人在线视频www| 亚洲第一偷拍网| 五月婷婷综合在线观看| 999视频精品| 午夜精品理论片| 亚洲天堂久久久久| 成人丝袜高跟foot| 色狠狠久久av五月综合| 日韩电影免费观看| 91国在线观看| 亚洲911精品成人18网站| 免费欧美一区| 欧美精品一区在线播放| 亚洲毛片一区二区三区| 国产成人免费在线| 日韩高清专区| 成人超碰在线| 欧美喷水一区二区| 3d动漫精品啪啪一区二区下载| 欧美激情理论| 日本精品视频在线播放| www.久久成人| 国产精品色呦呦| 中国丰满人妻videoshd | 亚洲少妇xxx| 亚洲在线黄色| 成人欧美一区二区三区视频| av亚洲在线| 欧美日韩综合视频| 国产xxx在线观看| 五月婷婷六月综合| 日本午夜在线亚洲.国产| 亚洲欧美另类日韩| 亚洲色图在线看| 欧美性猛交xxx乱久交| 加勒比中文字幕精品| 美女啪啪无遮挡免费久久网站| 在线精品免费视| 成人av午夜电影| 国产 国语对白 露脸| 国产91欧美| 一区二区三区黄色| 毛片毛片女人毛片毛片| 成人一区二区三区在线观看| 中文字幕日韩一区二区三区| 日韩高清在线| 亚洲天堂免费在线| www五月天com| 久久久影视传媒| 久久成人免费观看| 国产精品香蕉| 97视频免费看| 日本精品久久久久久| 亚洲综合精品自拍| 久草免费资源站| 韩国亚洲精品| 国产精品久久久久久久久久直播 | 黄色大片在线免费观看| 欧美日韩一二三四五区| 99久久人妻无码中文字幕系列| 激情六月综合| 精品国产乱码久久久久久88av| 国内在线免费视频| 亚洲国产精品热久久| 国产成人在线免费观看视频| av电影天堂一区二区在线观看| 欧美人成在线观看| 鲁大师精品99久久久| 69视频在线免费观看| 天堂а在线中文在线无限看推荐| 欧美日韩激情视频8区| 成人影视免费观看| 日韩二区三区四区| 一区精品视频| 日本在线成人| 久久久久久久亚洲精品| av女名字大全列表| 色婷婷精品久久二区二区蜜臀av| 欧美人妻一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲精品一卡二卡三卡四卡| 成人黄色理论片| 欧美激情日韩图片| 欧美大片aaa| 欧美日韩在线观看一区二区 | 国产欧美久久一区二区| 18网站在线观看| 欧美精品一区在线观看| 性色av免费观看| 国产精品美女一区二区三区| 又黄又爽又色的视频| 日韩视频一区| 亚洲视频导航| 国产精品午夜av| 国产精品视频播放| 图片区小说区亚洲| 亚洲欧美日韩中文在线制服| 在线观看免费高清视频| 亚洲综合一区二区三区| 国产在线观看h| 国产一区二区三区不卡在线观看| 欧美视频免费看欧美视频| 国产一卡不卡| www.久久草| 精品123区| 久久久久中文字幕| 中文字幕在线播放| 亚洲精品成人久久| 国产精品人妻一区二区三区| 欧美日韩免费网站| xxxx日本少妇| 国产欧美一区二区在线观看| 一级全黄裸体片| 毛片不卡一区二区| 日本毛片在线免费观看| 欧美1区免费| 日韩视频精品| 日本国产精品| 亚洲一区二区中文| jizz久久久久久| 5252色成人免费视频| 黄色网页在线观看| 国产一区二区三区网站| 国产91久久久| 日韩一区二区三区视频在线| 亚洲大尺度在线观看| 无码av中文一区二区三区桃花岛| 日本黄色录像视频| 中文av字幕一区| aaaaa级少妇高潮大片免费看| 国产精品99久久久久久久女警 | 99热在这里有精品免费| 伊人国产精品视频| 青青青伊人色综合久久| 成年人视频网站免费观看| 欧美91精品| 自拍亚洲欧美老师丝袜| 精品日本12videosex| 久久精品美女| 美女av一区| 国产精品一区视频| 成人av影音| 成人国产一区二区| 午夜电影一区| 超碰97人人人人人蜜桃| 涩爱av色老久久精品偷偷鲁| 91在线观看免费高清| 日韩精品第二页| 成人黄色在线观看| 少妇高潮一区二区三区99| 国产精品国模在线| 懂色aⅴ精品一区二区三区| 国产福利成人在线| 电影在线观看一区二区| 国产精品久久久久久影视| 日韩精品免费观看视频| 国产91九色视频| 成人激情视屏| 91精品国产综合久久香蕉| 亚洲福利影视| 18成人免费观看网站下载| 日韩在线观看一区二区三区| 91视频99| 欧美a大片欧美片| 麻豆av一区二区三区久久| 九九视频精品全部免费播放| 日韩福利一区二区三区| 大片网站久久| 中文字幕中文字幕99| 亚洲综合小说| 久久久国内精品| 中文一区二区| 久久精品一区二| 久久福利资源站| 99精品视频免费版的特色功能| 国产91露脸合集magnet| 亚洲视频在线播放免费| 久久久久综合网| 亚洲精品国产精品乱码在线观看| 综合久久久久久久| 国产一级特黄a高潮片| 精品久久久免费| 青娱乐在线免费视频| 51精品秘密在线观看| www.天堂av.com| 亚洲欧美成人网| 秋霞成人影院| 91国内揄拍国内精品对白| 成人日韩精品| 91九色蝌蚪嫩草| 美女网站一区| 妞干网这里只有精品| 国产欧美精品| 性生活免费在线观看| 成人综合在线视频| 欧美另类z0zx974| 一区二区三区日韩在线观看| 一级片中文字幕| 欧美日韩国产免费一区二区 | 日韩欧美猛交xxxxx无码| 国产精品久久777777毛茸茸| 美女少妇一区二区| 成人性生交大片免费看视频在线| 一区二区三区四区免费| 亚洲乱码精品一二三四区日韩在线| 日韩精品一区二区在线播放| 欧美精品在线观看播放| 三级视频网站在线| 色综合色综合网色综合| 欧美日韩精品免费观看视完整| 91精品天堂| 色综合色综合| 各处沟厕大尺度偷拍女厕嘘嘘| 国产一区二区三区免费播放 | 啪啪亚洲精品| 黄网站色视频免费观看| 秋霞午夜鲁丝一区二区老狼| 久草视频福利在线| 日韩美女啊v在线免费观看| 激情五月婷婷网| 精品国产一区二区在线观看| 自拍视频在线播放| 欧洲亚洲妇女av| 国产精品久久久久av蜜臀| 一区二区日本| 奇米精品一区二区三区四区| 人妻无码中文久久久久专区| 亚洲日本在线天堂| 中文字幕av网站| 亚洲欧美日本另类| av资源一区| 成人午夜影院在线观看| 在线看片不卡| 中文字幕成人免费视频| 国产欧美精品区一区二区三区 | 亚洲av鲁丝一区二区三区| 欧美亚洲综合色| 欧美女子与性| 91av国产在线| 麻豆国产欧美一区二区三区r| 久久综合亚洲精品| 狠狠色狠狠色综合系列| sm捆绑调教视频| 欧美性感一类影片在线播放| 你懂的在线视频| 欧美一级视频一区二区| 欧美精品国产白浆久久久久| 亚洲精品无码国产| 成人丝袜视频网| 亚洲国产成人精品激情在线| 日韩女优av电影| 免费在线观看的电影网站| 91精品婷婷国产综合久久蝌蚪| 亚洲国产成人精品女人| 欧洲美女亚洲激情| 亚洲综合一区二区三区| 亚洲国产欧美另类| 久久免费视频观看| 日本成人7777| caoporn超碰97| 国产精品色婷婷久久58| 中文字字幕在线中文乱码| 三级精品视频久久久久| 亚洲人体在线| 国产精品88久久久久久妇女| 国产电影精品久久禁18| 国产主播在线观看| 亚洲精品av在线播放| 国产高清不卡| 神马欧美一区二区| 久久99国内精品| 欧美黑吊大战白妞| 亚洲第一综合天堂另类专| 欲香欲色天天天综合和网| 欧美中日韩一区二区三区| 蜜臀av性久久久久蜜臀av麻豆 | av福利精品| 国产一区深夜福利| 欧美日韩国产欧| 无套内谢大学处破女www小说| 色婷婷国产精品| 在线视频二区| 成人片在线免费看| 国产亚洲福利| 丁香六月激情综合| 日韩久久精品一区| 中文字幕在线视频久| 一级做a爰片久久| 成人夜色视频网站在线观看| 东京热一区二区三区四区| 最近2019中文字幕第三页视频| 18国产精品| 熟女人妇 成熟妇女系列视频| **性色生活片久久毛片| 丰满人妻妇伦又伦精品国产| 国产成人涩涩涩视频在线观看| 欧美高清视频在线观看mv| 制服丝袜av在线| 欧美亚洲国产bt| 99riav视频在线观看| 亚洲 国产 欧美一区| 成人黄页毛片网站| 亚洲性在线观看| 91成人天堂久久成人| 国产精品99一区二区三区| 亚洲黄色在线网站| 这里只有精品电影| 毛片无码国产| www.日本三级| 国产精品理论片在线观看| 香蕉视频国产在线| 5566av亚洲|