React实现模糊搜索和关键字高亮的示例代码

 更新时间:2023年11月18日 13:56:18   作者:某哈压力大  
这篇文章主要为大家详细介绍了React如何实现模糊搜索和关键字高亮的效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

背景

公司需要一个可视化页面,作为Redis查询展示的工具,方便同事进行快速检索。

要求将后端返回的报文,完整展现在识图中,并且可以提供关键词检索和关键词点亮的功能,以便快速定位关键词。

整体效果预览:

主要功能

点击搜索:返回的大字符串形式报文被组装成JSON的格式,点击搜索匹配相应字段, 并高亮显示

点击区分大小写:模糊匹配 OR 精确匹配

查找下一个:被选中的字段,往下移动一个,下一个的背景颜色切换为另一高亮色

解决

  • 匹配到的文本,动态插入样式
  • 使用正则解决匹配问题
  • 点击下一个时,动态切换类名和背景色

代码实现

仅仅贴出主要代码

DOM

...
<Input 
    value={this.state.txt}
    placeholder="请输入检索内容"
    onChange={e => this.setState({txt: e.target.value})}
></Input>
<Button onClick={this.dispatchHighLightText}>
    搜索
</Button>
...
<CheckBos 
    checked={this.state.isCheck}
    onChange={e => this.setState({isCheck: e.target.checked})}
>
	区分大小写
</CheckBos>
...
<Button
    onClick={this.searchToNext}
>
    查找下一个
</Button>

...
<pre
    dangerouslySetInnerHTML={{__html: this.state.information}}
    contentEditable
>
    {/*动态插入html的容器*/}
</pre>

CSS

// 每个匹配到的都有的类名
.highLight{
    background-color: #a9a9a9;
}
// 点击下一个时的类名,默认为第一个
.current{
    background-color: #32aaf8;
}

JS

点击搜索时

colorIndex = 0; // 初始化高亮标记
_information = ''; // 文本备份
dispatchHighLightText = () => {
    const {txt} = this.state; // 检索内容
    if(!txt){
        message.warning("请先输入查询条件"); 
        return;
    }
    // 重置高亮标记
    colorIndex = 0;
    const regex = new RegExp(txt, this.state.isCheck ? 'g' : 'gi'); // 不勾选 => 模糊匹配
    // 由于每次插入样式都会污染文本,所以每次都需要从备份文本中重新渲染
    const newInformation = _information;
    const hightLightTxt = newInformation.replace(regex, (match,index) => `<span class="highLight"> ${match} </span>`);
    this.setState({infomation: hightLightTxt}, () => {
        // 视图更新渲染然后,获取到dom
        let highLightEle = document.querySelectorAll('.highLight');
        this.updateHeight(highLightEle)
    }); // render
}

// 点亮目标关键字
updateHeight = (highLightEle) => {
    highLightEle.forEach((element, index) => {
        if(index === colorIndex){
            element.classList.add('current');
            element.scrollIntoView({ behavior: 'smooth', block: 'center'});
        }else{
            element.classList.remove('current');
        }
    })
}

点击 “下一个”

searchToNext = () => {
    let highLightEle = document.querySelectorAll('.highLight');
    if(heighLightEle.length){
        colrIndex = (colorIndex + 1 + highLightEle.length) % highLightEle.length;
        this.updateHeight(highLightEle)
    }
}

反思

  • 本来想用偏移量window.getSelection 和 document.createRange 以及相关api模拟富文本实现光标跳转定位的,可是发现偏移量不好确定(小菜鸡)
  • 每次渲染的时候需要拿新的备份的文本进行替换,不要用脏数据
  • pre标签可以很好的保留文本原来的样式,不能用textarea
  • dangerouslySetInnerHTML接收的是一个对象

以上就是React实现模糊搜索和关键字高亮的示例代码的详细内容,更多关于React模糊搜索和关键字高亮的资料请关注脚本之家其它相关文章!

相关文章

  • React useEffect不支持async function示例分析

    React useEffect不支持async function示例分析

    这篇文章主要为大家介绍了React useEffect不支持async function示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • React库之react-beautiful-dnd介绍及其使用过程

    React库之react-beautiful-dnd介绍及其使用过程

    在使用React构建Web应用程序时,拖拽功能是一项常见需求,为了方便实现拖拽功能,我们可以借助第三方库react-beautiful-dnd,本文将介绍react-beautiful-dnd的基本概念,并结合实际的项目代码一步步详细介绍其使用过程,需要的朋友可以参考下
    2023-11-11
  • react hooks实现防抖节流的方法小结

    react hooks实现防抖节流的方法小结

    这篇文章主要介绍了react hooks实现防抖节流的几种方法,文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-04-04
  • react中useState改变值不渲染的解决方式

    react中useState改变值不渲染的解决方式

    这篇文章主要介绍了react中useState改变值不渲染的解决方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • react-routerV6版本和V5版本的详细对比

    react-routerV6版本和V5版本的详细对比

    React-Router5是React-Router6的前一个版本,它已经被React-Router6取代,React-Router 6是一次较大的重大更新,本文就来介绍一下react-routerV6版本和V5版本的详细对比,感兴趣的可以了解一下
    2023-12-12
  • React受控组件和非受控组件对比详解

    React受控组件和非受控组件对比详解

    在使用React搭建用户界面时,组件可以分为两类:受控组件和费受控组件这两种组件在数据处理方式上有着显著的差异,理解它们的区别对于构建高效和可控的React应用至关重要,本文将深入探讨这两种组件的定义、特点以及使用场景,并通过示例代码帮助你更加清晰地理解它们
    2025-01-01
  • React 中常用的几种路由跳转方式小结

    React 中常用的几种路由跳转方式小结

    基本路由跳转是最常见的一种方式,下面介绍React 中常用的几种路由跳转方式,感兴趣的朋友一起看看吧
    2023-12-12
  • React实现浮层组件的思路与方法详解

    React实现浮层组件的思路与方法详解

    React 浮层组件(也称为弹出组件或弹窗组件)通常是指在用户界面上浮动显示的组件,本文主要介绍了浮层组件的实现方法,感兴趣的小伙伴可以了解下
    2024-02-02
  • react中如何使用局部样式

    react中如何使用局部样式

    这篇文章主要介绍了react中如何使用局部样式问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • React实现轮播效果

    React实现轮播效果

    这篇文章主要为大家详细介绍了React实现轮播效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08

最新评论