当前位置:首页 > React

react实现单词高亮

2026-01-26 20:05:06React

实现单词高亮的基本思路

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

使用字符串替换方法

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

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类名控制高亮样式更易于维护:

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

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

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

支持富文本与安全处理

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

react实现单词高亮

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

如何记忆react

理解核心概念 React的核心概念包括组件、状态(state)、属性(props)、生命周期方法(类组件)和钩子(函数组件)。掌握这些基础概念是记忆React的关键。组件是React应用的构建块,分为…

如何安装react

如何安装react

安装React的方法 方法一:使用Create React App(官方推荐) Create React App是官方提供的脚手架工具,适合快速搭建React项目。确保已安装Node.js(建议版本≥…

react 如何循环

react 如何循环

循环渲染列表 在React中,循环渲染列表通常使用map方法。map可以遍历数组并返回一个新的React元素数组。 const items = ['Apple', 'Banana', 'Orange…

vue实现单词逆转

vue实现单词逆转

Vue实现单词逆转的方法 在Vue中实现单词逆转功能,可以通过以下几种方式实现。以下是具体实现步骤和代码示例。 方法一:使用计算属性 计算属性适合处理需要响应式更新的数据。可以通过计算属性将输入的单…

react如何减少setState

react如何减少setState

减少 React 中 setState 调用的方法 合并多次状态更新 使用函数式更新方式合并多次 setState 调用。React 会将多次状态更新批量处理,避免不必要的重新渲染。 // 非函…

react如何检测窗口

react如何检测窗口

监听窗口大小变化 使用useEffect钩子和resize事件监听窗口尺寸变化。在组件挂载时添加事件监听器,卸载时移除监听器以避免内存泄漏。 import { useState, useEffect…