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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ifftshift函数

ifftshift 原理 将频域数据移回时域的函数。它通常与 fftshift 配合使用&#xff0c;后者用于将时域数据移动到频域中心。 而ifftshift所作的事正好相反&#xff0c;将频谱恢复到能量集中在两端&#xff08;或四个角&#xff09;上&#xff0c;接着就可以做逆傅里叶变换了 具…

基于YOLOv11的动物类别实时检测系统(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)

100多种【基于YOLOv8/v10/v11的目标检测系统】目录&#xff08;pythonpyside6界面系统源码可训练的数据集也完成的训练模型&#xff09; 摘要&#xff1a; 本文提出了一种基于YOLOv11算法的动物检测系统&#xff0c;利用7101张图片&#xff08;5521张训练集&#xff0c;1580张…

OutLook for Windows(New) 滚蛋吧

电脑OS:Windows 10 问题发生原因,不小心点击了应用商店里面的全部更新,电脑上的邮件 (UWP)应用直接给升级成最新的了,点击邮件直接闪切OutLook for Windows(New) 这个软件, 应用升级本来是一件好的事情,但是在Windows应用商店里面就是一件非常差劲的事情,有的软件升级之后更难…

力扣刷题(sql)--零散知识点(1)

通过一段时间的刷题&#xff0c;感觉自己的sql能力逐渐上去&#xff0c;所以不会像前三道题一样讲那么详细了&#xff0c;这里主要会讲到一些特殊的知识点和方法。另外&#xff0c;我的建议是做完一个题有好的想法赶紧记录下来&#xff0c;不要想着最后汇总&#xff0c;不然会懒…

文献阅读记录5-Recent Progress in the Discovery and Design of AntimicrobialPeptides

文章名字是Recent Progress in the Discovery and Design of Antimicrobial Peptides Using Traditional Machine Learning and Deep Learning&#xff0c;24年发表 摘要 由于传统抗生素的滥用和多重耐药微生物的增加&#xff0c;抗菌药物耐药性已成为一个全球性的重大健康问…

MySQL创建库,设计表

要求&#xff1a; 根据以下需求完成图书管理系统数据库及表设计&#xff0c;并建库建表&#xff0c;并截图创建表 的详细信息(desc 表名),不用添加数据 1. 用户表: 字段: 姓名&#xff0c;用户名&#xff0c;密码&#xff0c;电话&#xff0c;住址&#xff0c;专业及年级 2. 图…

Maven 项目管理工具

目录 Maven简介 Maven快速上手 Maven详细介绍 Maven工作机制 Maven安装及配置 使用IDEA创建Maven Web工程 Maven简介 Maven是 Apache 开源组织奉献的一个开源项目&#xff0c;可以翻译为“专家”或“内行”。 Maven 的本质是一个项目管理工具&#xff0c;将项目开发和管…

unity3d——Time

在Unity3D中&#xff0c;Time类是一个非常重要的工具类&#xff0c;它提供了一系列与时间相关的属性和方法&#xff0c;帮助开发者在游戏中实现各种时间相关的操作。以下是一些Time类常用的方法及其示例&#xff1a; 一、常用属性 Time.time 含义&#xff1a;表示从游戏开始到…

华为大咖说丨如何通过反馈机制来不断优化大模型应用?

本文分享自时习知 作者&#xff1a;袁泉&#xff08;华为AI数据工程专家&#xff09;全文约3015字&#xff0c;阅读约需8分钟 大模型应用正式投入使用后&#xff0c;存在一个较为普遍的情况&#xff1a;在利用“大模型提升业务运营效率”的过程中&#xff0c;业务部门和IT团队…

K8S如何基于Istio重新实现微服务

K8S如何基于Istio重新实现微服务 认识 Istio前言Istio 的理念Istio 的架构数据平面控制平面服务与 Istio 的关系 Istio 实践环境准备安装 Helm安装Istio 使用 Istio 代理运行应用情感分析应用的架构使用 Istio 代理运行应用Sidecar 注入Ingress 网关网关资源VirtualService 资源…

动态规划 —— 路径问题-不同路径

1. 不同路径 题目链接&#xff1a; 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/unique-paths/description/ 2. 算法原理 1. 状态表示&#xff1a;以莫一个位置为结尾 dp[i]表示&#xff1a;以[i&#xff0c;j]位置为结尾时&#xff0…

本地Docker部署开源WAF雷池并实现异地远程登录管理界面

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

[四轴飞行器] 航模常见术语

航模常见术语 1.X模式和模式 从结构形式上四轴飞行器可分为十字模式和X模式。十字模式如下图左所示&#xff0c;X模式如下图右所示。对于姿态测量和控制来说&#xff0c;两种结构差别不大。如果考虑安装航拍摄 像机&#xff0c;为了视线不被挡住&#xff0c;通常采用X模式。 …

mysql原理、部署mysql主从+读写分离、监控mysql主从脚本

mysql&#xff1a;工作原理 从库生成两个线程&#xff0c;一个I/O线程&#xff0c;一个SQL线程&#xff1b; i/o线程去请求主库 的binlog&#xff0c;并将得到的binlog日志写到relay log&#xff08;中继日志&#xff09; 文件中&#xff1b; 主库会生成一个 log dump 线程&…

2024最新保姆级Python下载安装教程

今天给大家带来Python下载安装教程&#xff01; &#x1f449;大礼包&#x1f381;&#xff1a;python安装包/pycharm教程免费分享&#xff08;安全链接&#xff0c;放心点击&#xff09;&#x1f448; 一、下载装 Python 1、进入Python官网首页&#xff0c;下载最新的Pytho…

云服务器中删除非空目录(包含文件和子目录)rm -rf <directory_name>

在云服务器中删除目录可以使用 rm 命令。如果您需要删除一个非空目录&#xff08;包含文件和子目录&#xff09;&#xff0c;可以使用以下命令&#xff1a; rm -rf <directory_name>参数解释&#xff1a; -r&#xff1a;递归删除&#xff0c;即删除目录及其所有内容&am…

【ChatGPT】在多轮对话中引导 ChatGPT 保持一致性

在多轮对话中引导 ChatGPT 保持一致性 多轮对话是与 ChatGPT 等对话模型互动时的一大特点&#xff0c;特别是在复杂任务和长时间对话中&#xff0c;保持对话的一致性显得尤为重要。用户往往希望 ChatGPT 能够在上下文中理解先前的对话内容&#xff0c;避免反复重申问题或者给出…

Chromium HTML5 新的 Input 类型color 对应c++

一、Input 类型: color color 类型用在input字段主要用于选取颜色&#xff0c;如下所示&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body&…

outlook创建新账户时报错2603、2604的解决办法

全新的戴尔笔记本电脑&#xff0c;自带的Win11家庭版&#xff0c;安装ms office 2021也顺利完成。 但是奇怪的是&#xff0c;只有其中一台笔记本电脑&#xff0c;OUTLOOK无法添加新账户。 但是这个账号在WEB端登录正常&#xff0c;由于是新入职的员工&#xff0c;根据以往经验&…

transformer的新手疑问

Transformer模型的原理主要基于自注意力机制&#xff08;Self-Attention&#xff09;和编码器-解码器结构。它的设计不依赖传统的循环神经网络&#xff08;RNN&#xff09;或卷积神经网络&#xff08;CNN&#xff09;&#xff0c;而是通过并行的方式处理序列数据&#xff0c;极…