如何在 React 中安全解析 HTML 并保留自定义组件的大小写敏感性-html教程

本文详解为何 `dangerouslysetinnerhtml` 无法渲染 react 组件(如 `syntaxhighlighter`),并提供基于 `react-html-parser` 的可靠解决方案:通过 `transform` 函数精准拦截 “ 标签,动态注入正确大小写的 jsx 组件,兼顾安全性、可维护性与语法高亮需求。

在 CMS 驱动的博客场景中,你常会接收原始 HTML 字符串(例如 CKEditor 输出的

<code>a = 1 + 2</code>

),并希望将其渲染为带语法高亮的 React 组件。一个常见误区是尝试将 JSX 字符串(如 …)直接拼接进 HTML 字符串,再通过 dangerouslySetInnerHTML 渲染——这必然失败,因为浏览器只解析标准 HTML,而 SyntaxHighlighter 是 React 组件,非 HTML 元素;更关键的是,HTML 解析器会将自定义标签名强制转为小写(syntaxhighlighter),导致 React 无法识别。

✅ 正确路径是:解析 HTML 结构 → 识别语义节点 → 动态替换为真实 React 元素。推荐使用 react-html-parser(v2+)配合其 transform 选项,它在解析过程中逐节点回调,允许你对特定标签(如 )返回完全可控的 JSX:

import React from 'react';
import ReactHtmlParser from 'react-html-parser';
import { SyntaxHighlighter } from 'react-syntax-highlighter';
import { dark } from 'react-syntax-highlighter/dist/cjs/styles/hljs';

function transform(node) {
  // 精准匹配 <code> 标签(注意:需同时处理 <pre class="brush:php;toolbar:false;"><code> 嵌套结构)
  if (node.type === 'tag' && node.name === 'code') {
    // 提取 code 内容(兼容文本节点或嵌套标签)
    const codeText = node.children?.find(child => child.type === 'text')?.data || '';

    return (
      <SyntaxHighlighter 
        language="python" 
        style={dark} 
        customStyle={{ margin: '1rem 0', borderRadius: '6px' }}
      >
        {codeText.trim()}
      </SyntaxHighlighter>
    );
  }
}

// 在组件中使用
function Post({ htmlContent }) {
  return (
    <article className="post-content">
      {ReactHtmlParser(htmlContent, { transform })}
    </article>
  );
}

⚠️ 注意事项:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 如何在 React 中安全解析 HTML 并保留自定义组件的大小写敏感性-html教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4011812+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4011812+
  • 本周更新: 0+
  • 最后更新: 2026-03-16