当前位置:首页 > 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
分享给朋友:

相关文章

vue实现单词拼写

vue实现单词拼写

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

react如何部署

react如何部署

部署 React 应用的常见方法 使用静态服务器部署 React 应用在构建后会生成静态文件,可以直接通过静态服务器部署。常用的静态服务器包括 Nginx、Apache 等。 运行构建命令生成静态文…

react如何安装

react如何安装

安装React的步骤 确保已安装Node.js(建议版本12或更高),可通过以下命令检查版本: node -v npm -v 使用Create React App快速搭建项目(推荐): npx c…

react 如何跳转

react 如何跳转

使用 React Router 进行页面跳转 React 应用中通常使用 react-router-dom 库实现页面跳转。以下是几种常见的跳转方式: 安装依赖 npm install react…

react如何发布

react如何发布

发布React应用的步骤 构建生产版本 使用以下命令生成优化后的生产版本代码,代码会被压缩并移除开发环境中的调试工具: npm run build 构建完成后会生成build文件夹,包含所有静态资源…

react如何重启

react如何重启

重启 React 应用的方法 重新加载当前页面 使用 window.location.reload() 强制刷新页面,这会重新加载整个应用并重置所有状态。 window.location.rel…