关键词高亮

关键词高亮
在这里插入图片描述

检索关键词拆分

关键代码

text.split(keyword)
	.flatMap(str => ([{text: keyword, class: 'highlight'}, {text: str}]))
	.slice(1)
	.filter(item => Boolean(item.text))
  1. split:按关键词拆分
  2. flatMap:在每个分割后的的片段前增加一个高亮元素,补回切掉的关键词,但头部多一个高亮元素
  3. slice:去掉头部多出的高亮元素

示例

const text = '1034056';
const keyword = '0';
text.split(keyword)						// ['1', '34', '56']				按关键词拆分
	.flatMap(str => ([keyword, str]))	// ['0', '1', '0', '34', '0', '56']	往每项前面插入一项关键字
	.slice(1).filter(Boolean)			// ['1', '0', '34', '0', '56']		去掉头部多出的项
const text = '01034056';
const keyword = '0';
text.split(keyword)						// ['', '1', '34', '56']						按关键词拆分
	.flatMap(str => ([keyword, str]))	// ['0', '', '0', '1', '0', '34', '0', '56']	往每项前面插入一项关键字
	.slice(1)							// ['', '0', '1', '0', '34', '0', '56']			去掉头部多出的项
	.filter(Boolean)					// ['0', '1', '0', '34', '0', '56']				去掉空项

参考:掘金|React 一行代码实现关键词高亮

split使用RegExp来分割使结果中包含分割符

关键代码

text.split(new RegExp(`(${keyword})`))
	.map(item => (item === keyword ? ({text: keyword, class: 'highlight'}) : ({text: item})));

示例

const text = '01034056';
const keyword = '0';
text.split(new RegExp(`(${keyword})`))	// ['', '0', '1', '0', '34', '0', '56']
	.map(item => (item === keyword ? ({text: keyword, class: 'highlight'}) : ({text: item})));
// {text: ''},
// {text: '0', class: 'highlight'},
// {text: '1'},
// {text: '0', class: 'highlight'},
// {text: '34'},
// {text: '0', class: 'highlight'},
// {text: '56'}

参考:MDN|String.prototype.split()

示例代码

<input v-model="keyword" type="text">
<div>
	<span v-for="(item, index) in list" ::key="index" :class="item.class">{{ item.text }}</span>
</div>
export default {
	data() {
		return {
			text: `从每一个寻寻觅觅的日子里,穿行而过,看似捕手的,可能也是猎物,看似平常的,可能正是宝藏。灵魂触角,敏感或是迟钝,都有权尽情舞蹈,大千世界啊,风马牛秘密联络,肉眼所得,仅供参考。过去,当下,未来,未必真有界限,时间,只是行一个方便的幻觉。所以,无忧无惧,专心游戏,无牵无挂,寻宝之旅。广袤星河里亿万生命,何其有幸,与你一同在场,就在,这里。寻宝游戏演唱会。`,
			keyword: ''
		};
	},
	computed: {
		list() {
			const text = this.text;
			const keyword = this.keyword;
			if (!keyword) return [{ text }];
			return text.split(new RegExp(`(${keyword})`)).filter(Boolean).map(item => (item === keyword ? ({text: keyword, class: 'highlight'}) : ({text: item})));
		}
	}
}
.highlight {
	color: #f40;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值