当前位置:首页 > React

react实现单词高亮

2026-01-26 20:05:06React

实现单词高亮的基本思路

在React中实现单词高亮的核心逻辑是通过字符串替换或正则表达式匹配目标单词,将其包裹在带有高亮样式的HTML元素(如<span>)中。需要处理动态输入、大小写敏感等场景。

使用字符串替换方法

将目标文本按关键词拆分后重新组合,为匹配部分添加高亮样式。以下是一个基础实现示例:

react实现单词高亮

function HighlightText({ text, keyword }) {
  if (!keyword) return text;

  const parts = text.split(new RegExp(`(${keyword})`, 'gi'));
  return (
    <>
      {parts.map((part, i) =>
        part.toLowerCase() === keyword.toLowerCase() ? (
          <span key={i} style={{ backgroundColor: 'yellow' }}>
            {part}
          </span>
        ) : (
          part
        )
      )}
    </>
  );
}

正则表达式匹配复杂场景

需要处理特殊字符或多单词匹配时,需对关键词进行转义并优化正则:

function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

function HighlightText({ text, keywords }) {
  if (!keywords.length) return text;

  const regex = new RegExp(
    `(${keywords.map(escapeRegExp).join('|')})`,
    'gi'
  );
  const parts = text.split(regex);

  return (
    <>
      {parts.map((part, i) =>
        keywords.some(k => 
          k.toLowerCase() === part.toLowerCase()
        ) ? (
          <span key={i} className="highlight">{part}</span>
        ) : (
          part
        )
      )}
    </>
  );
}

样式与性能优化

通过CSS类名控制高亮样式更易于维护:

react实现单词高亮

.highlight {
  background-color: #ffeb3b;
  font-weight: bold;
  padding: 0 2px;
}

对于长文本或高频更新场景,考虑使用useMemo优化:

const highlightedText = useMemo(() => {
  // 高亮处理逻辑
}, [text, keywords]);

支持富文本与安全处理

若文本包含HTML标签,需使用DOMPurify等库防止XSS攻击:

import DOMPurify from 'dompurify';

function sanitizeAndHighlight(text, keyword) {
  const sanitized = DOMPurify.sanitize(text);
  // 高亮处理逻辑
}

完整组件示例

import React, { useMemo } from 'react';
import DOMPurify from 'dompurify';

function HighlightText({ text, keywords = [], caseSensitive = false }) {
  const highlighted = useMemo(() => {
    if (!keywords.length) return text;

    const flags = caseSensitive ? 'g' : 'gi';
    const pattern = `(${keywords.map(escapeRegExp).join('|')})`;
    const regex = new RegExp(pattern, flags);

    return DOMPurify.sanitize(text).split(regex).map((part, i) => {
      const isMatch = keywords.some(k => 
        caseSensitive 
          ? k === part 
          : k.toLowerCase() === part.toLowerCase()
      );
      return isMatch ? (
        <span key={i} className="highlight">{part}</span>
      ) : part;
    });
  }, [text, keywords, caseSensitive]);

  return <>{highlighted}</>;
}

标签: 单词react
分享给朋友:

相关文章

react native如何启动

react native如何启动

React Native 启动步骤 确保已安装 Node.js(建议版本 14 或更高)和 npm/yarn。安装完成后,通过命令行工具执行以下操作。 初始化新项目 使用 React Native…

如何评价react native

如何评价react native

React Native 的优势 跨平台开发效率高 React Native 允许开发者使用 JavaScript 和 React 编写代码,同时生成 iOS 和 Android 应用,大幅减少开发成…

react 如何继承

react 如何继承

在React中,组件继承并非推荐的设计模式(官方更推崇组合优于继承),但技术上仍可通过以下方式实现类似效果: 使用ES6类继承 通过extends关键字继承父组件类,子组件可访问父组件的生命周期方…

vue实现单词拼写

vue实现单词拼写

Vue 实现单词拼写功能 在 Vue 中实现单词拼写功能,可以通过数据绑定、事件处理和动态样式来实现。以下是一个完整的实现方案。 数据准备 定义一个包含单词和提示信息的数组,用于拼写练习:…

vue实现单词反转

vue实现单词反转

实现单词反转的方法 在Vue中实现单词反转可以通过多种方式完成,以下是几种常见的方法: 方法一:使用计算属性 在Vue组件中定义一个计算属性,利用JavaScript的字符串和数组方法实现反转…

react moment如何使用

react moment如何使用

安装 react-moment 通过 npm 或 yarn 安装 react-moment: npm install react-moment 或 yarn add react-moment…