React写关键字高亮的三个方案

1.js正则replaceAll+dangerouslySetInnerHTML={{ __html: xxx }}危险属性

步骤最简单,但是是危险属性,不推荐使用,项目中实在没有头绪,可以使用它应急

通过useMemo计算得到新的状态值,赋值给dangerouslySetInnerHTML属性的__html

关键代码:

const [state1, setState1] = useState('我爱中国,中国爱我')

const updateState1 = useMemo(() => {
    return state1.replaceAll('中国', '<span style="color:red;">中国</span>')
  }, [state1])


<div dangerouslySetInnerHTML={{ __html: updateState1 }}></div>

2.useMemo计算遍历后将关键字替换为React标签写法(内容为关键字),使用_.map渲染

(要不是replace不能转换为React标签,只支持字符串也不用这么麻烦)

关键代码:

const updateState2 = useMemo(() => {
    return highlightPassword(state2, '_.map_')
  }, [state2])


  function highlightPassword(str0: any, key_prefix?: string) {
    const password = '中国';
    const pattern = new RegExp(`\\B(?=((${password})+)+(?!(${password})))`, 'g')
    return str0.replace(pattern, '||||').split('||||').map((item, index) => {
      const idx = item.indexOf(password)
      return <span key={key_prefix + index}>
        {
          idx >= 0
            ? <><span style={{ color: 'red' }}>{item.substring(0, password.length)}</span>{item.substring(password.length, item.length)}</>
            : item
        }
      </span>
    });
  }


      <p>map遍历children元素:</p>
      {_.map(updateState2, (child) => {
        return child
      })}

3.遍历后将关键字替换为React标签写法(内容为关键字),使用ReactDOM.render方法插入到指定元素中

关键代码:

const Test = () => {
  const [state2, setState2] = useState<any>('我爱中国,中国中国爱我')
  useEffect(() => {
    // 遍历将关键字换成react写法的标签,使用ReactDOM.render方法渲染到页面上
    const str = highlightPassword(state2, 'ReactDOM.render_')
    ReactDOM.render(<div>{str}</div>, document.getElementsByClassName('my-highlight-test')[0])
  }, [state2])


 function highlightPassword(str0: any, key_prefix?: string) {
    const password = '中国';
    const pattern = new RegExp(`\\B(?=((${password})+)+(?!(${password})))`, 'g')
    return str0.replace(pattern, '||||').split('||||').map((item, index) => {
      const idx = item.indexOf(password)
      return <span key={key_prefix + index}>
        {
          idx >= 0
            ? <><span style={{ color: 'red' }}>{item.substring(0, password.length)}</span>{item.substring(password.length, item.length)}</>
            : item
        }
      </span>
    });
  }


      <p>ReactDOM.render方法:</p>
      <div className="my-highlight-test"></div>


完整代码示例: 

import React, { useEffect, useMemo, useState } from 'react'
import ReactDOM from 'react-dom';
import _ from 'lodash';

const Test = () => {
  const [password,] = useState('中国')
  const [state1, setState1] = useState('我爱中国,中国爱我')
  const [state2, setState2] = useState<any>('我爱中国,中国中国爱我')
  useEffect(() => {
    // 遍历将关键字换成react写法的标签,使用ReactDOM.render方法渲染到页面上
    const str = highlightPassword(state2, 'ReactDOM.render_')
    ReactDOM.render(<div>{str}</div>, document.getElementsByClassName('my-highlight-test')[0])
  }, [state2])

  const updateState1 = useMemo(() => {
    return state1.replaceAll(password, str => `<span style="color:red;">${str}</span>`)
  }, [state1])

  const updateState2 = useMemo(() => {
    return highlightPassword(state2, '_.map_')
  }, [state2])

  useEffect(() => {
    setTimeout(() => {
      setState1('哈哈哈,中国万岁,万岁万万岁,中国加油!')
      setState2('哈哈哈,中国中国万岁,万岁万万岁,中国中国加油!爱你中国!')
    }, 2000)
  }, [])


  function highlightPassword(str0: any, key_prefix?: string) {
    const pattern = new RegExp(`\\B(?=((${password})+)+(?!(${password})))`, 'g')
    return str0.replace(pattern, '||||').split('||||').map((item, index) => {
      const idx = item.indexOf(password)
      return <span key={key_prefix + index}>
        {
          idx >= 0
            ? <><span style={{ color: 'red' }}>{item.substring(0, password.length)}</span>{item.substring(password.length, item.length)}</>
            : item
        }
      </span>
    });
  }

  return (
    <div>
      <p>dangerouslySetInnerHTML方式:</p>
      <div dangerouslySetInnerHTML={{ __html: updateState1 }}></div>
      <p>map遍历children元素:</p>
      {_.map(updateState2, (child) => {
        return child
      })}
      <p>ReactDOM.render方法:</p>
      <div className="my-highlight-test"></div>
    </div>
  )
}

export default Test

显示效果:

初始化页面时:

2cacd40d3968477585d8674b3ff964db.png

2s后(模拟异步请求数据)显示:

73bd463cfc634e0f894bd4114ae05331.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/902012.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络原理】网络地址转换----NAT技术详解

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;计算机网络那些事 我们在 IP协议 一文中介绍过&#xff0c;由于IPv4协议中 IP地址只有32位&#xff0c;导致最多只能表示 42亿9千万个IP地址。但我们需要通过IP地址来标识网络上的每一个设备&#x…

java核心技术点都有哪些

1. 面向对象编程&#xff08;OOP&#xff09; 核心概念&#xff1a;类、对象、继承、封装、多态。 比喻&#xff1a;面向对象编程就像是在搭建一个积木城堡。类&#xff08;Class&#xff09;是城堡的设计图纸&#xff0c;它定义了城堡的结构和功能&#xff1b;对象&#xff08…

传输层TCP

报头 1.报头和有效载荷如何分离将&#xff0c;有效载荷向上交付&#xff1f; tcp有个标准报头长度为20&#xff0c;那是不是以为我们可以像udp一样分离依靠报头大小去分离&#xff0c;我们仔细去看我们报头中还有个选项没包含到。 我们还有个首部长度&#xff0c;四位可以表…

测试代理IP的有效性和可用性

使用代理IP的有效性和可用性直接关系到用户的工作效率&#xff0c;尤其是在进行数据抓取、网络爬虫和保护个人隐私等场景中。 一、测试代理IP的必要性 代理IP的可用性测试是确保代理服务正常运行的重要步骤。测试代理IP的必要性主要体现在以下几个方面&#xff1a; 提升工作…

【Docker命令】日常使用的Docker命令

Docker常用命令 1、基础命令2、容器管理3、镜像管理推送镜像 4、网络管理5、数据管理 1、基础命令 - docker run&#xff1a;运行一个容器,--name 指定容器的名称&#xff0c;-i 获取标准输入输出&#xff0c;-t显示在终端&#xff0c;-d放到后台运行&#xff0c;--rm容器停止…

STM32传感器模块编程实践(十) 2.4G NRF24L01通信模块简介及驱动源码

文章目录 一.概要二.NRF24L01模块介绍三.NRF24L01模块主要特性四.国产射频芯片SI24R1介绍五.模块接线说明六.参考原理图七.通讯协议介绍八.STM32单片机与NRF24L01模块实现远无线通讯实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 九.源代码工程下载十.小结 一.概要 NRF24…

InnoDB 存储引擎<二>页结构和行结构

目录 ⻚结构 ⾏结构 ⻚结构 ⻚在MySQL运⾏的过程中起到了⾮常重要的作⽤&#xff0c;为了能发挥更好的性能&#xff0c;可以结合⾃⼰系统的 业务场景和数据⼤⼩&#xff0c;对⻚相关的系统变量进⾏调整&#xff0c;⻚的⼤⼩就是⼀个⾮常重要的调整项 1.⻚的⼤⼩可以设置吗&…

RHCSA笔记一

常见的操作系统 UNIX 、 Linux 类、 Windows 类 搭建Linux学习环境 如何安装linux操作系统&#xff1a; 安装独立的 Linux 系统&#xff0c;不再安装其他操作系统。 安装 Windows 与 Linux 并存的多操作系统&#xff0c;启动时通过菜单选择要启动的操作系统。 在虚拟机中安…

十一、数据库配置

一、Navicat配置 这个软件需要破解 密码是&#xff1a;123456&#xff1b; 新建连接》新建数据库 创建一个表 保存出现名字设置 双击打开 把id设置为自动递增 这里就相当于每一次向数据库添加一个语句&#xff0c;会自动增长id一次 二、数据库的增删改查 1、Vs 建一个控…

探索华为云DataArts Insight:数据智能的新引擎

在快速发展的数字化时代&#xff0c;数据已经成为企业最宝贵的资产。如何有效地管理和利用这些数据&#xff0c;以实现商业价值&#xff0c;是每个企业需要面对的重要挑战。华为云DataArts Insight平台应运而生&#xff0c;作为一款强大的数据智能解决方案&#xff0c;它帮助企…

Kotlin-Annotations详解

在Kotlin中&#xff0c;注解&#xff08;Annotations&#xff09;是用于为代码提供元数据的一种机制。这些元数据可以被编译器、IDE&#xff08;集成开发环境&#xff09;或其他工具使用&#xff0c;以生成代码、执行编译时检查或提供运行时信息。 注解通常被用于类、方法、属…

算法的学习笔记—左旋转字符串(牛客JZ58)

&#x1f600;前言 在程序设计中&#xff0c;字符串处理问题屡见不鲜&#xff0c;其中“字符串左旋”是一种常见操作&#xff0c;今天我们一起来探讨一个经典的左旋转字符串题目&#xff0c;以及一种优雅的解决方案——三步翻转法。 &#x1f3e0;个人主页&#xff1a;尘觉主页…

anaconda jupyter notebook themes install jupyter notebook样式更改,取消页面头部,全屏展示!

现在已经有很多相关的文章了&#xff0c;我只说简单的解决步骤&#xff1a; 我用的是anaconda的 jupyter notebook&#xff0c;这个要更改主题&#xff0c;方法有&#xff1a; 一&#xff0c;最简单&#xff1a;用 jupyter notebook自带的setting>Theme>自己选&#xff1…

模型 是否树(逻辑树之三)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。决策分支&#xff0c;是与否的逻辑路径。 1 是否树的应用 1.1 个人IP打造中的是否树应用案例&#xff1a;社交媒体营销策略 在个人品牌建设中&#xff0c;是否树可以帮助个人识别关键的决策点&#…

纯GO语言开发RTSP流媒体服务器-RTSP推流直播、本地保存录像、录像回放、http-flv及hls协议分发

温馨提示&#xff1a;我们分享的文章是给需要的人&#xff0c;不需要的人请绕过&#xff0c;不知道为什么总有一些人总觉得我们发的文章是给他看的&#xff0c;我们不逼任何人用或了解&#xff0c;不要一来就攻击我们&#xff0c;我们不惹事但也不怕事&#xff01;也希望大家和…

springboot083基于springboot的个人理财系统--论文pf(论文+源码)_kaic

基于springboot的个人理财系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了个人理财系统的开发全过程。通过分析个人理财系统管理的不足&#xff0c;创建了一个计算机管理个人理财系统的方案。文章介绍了个…

Depcheck——专门用于检测 JavaScript 和 Node.js 项目中未使用依赖项的工具

文章目录 Depcheck 是什麽核心功能&#x1f4da;检测未使用的依赖&#x1f41b;检测缺失的依赖✨支持多种文件类型&#x1f30d;可扩展性 安装与使用1. 安装 Depcheck2. 使用 Depcheck Depcheck 的应用总结项目源码&#xff1a; Depcheck 是什麽 来看一个常见错误场景&#x1…

深入了解 Android 中的命名空间:`xmlns:tools` 和其他常见命名空间

在 Android 开发中&#xff0c;xmlns &#xff08;.xml的namespace&#xff09;命名空间是一个非常重要的概念。通过引入不同的命名空间&#xff0c;可以使用不同的属性来设计布局、设置工具属性或者支持自定义视图等。除了 xmlns:tools 以外&#xff0c;还有很多常见的命名空间…

故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码

故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码 目录 故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码效果一览基本介绍程序设计参考资料 效果一览 基本介绍 CNN-ResNets&#xff08;卷积神经网络-残差网络&#xff09;在滚动轴承故障诊断中是一种常用的方法。这种方法利用…

VisionPro - 高级 - 保存模式以备后用 - 中心圆的查找配置

前言: 在基础篇, VisionPro Basic - 01- 有关应用和作业-CSDN博客 我们提到了应用和作业的保存,那么这些都是vpp的保存格式。 我们知道,在模式工具的配置中,如果我们做好了很多的调试,最后配置好参数后,也有一个保存模式的选项。我们在保存的时候,一定要添加前缀或…