ReactJS 将 HTML 字符串转换为 JSX

IT技术 javascript jquery ajax reactjs
2021-01-17 00:24:56

我在处理 facebook 的 ReactJS 时遇到了麻烦。每当我执行 ajax 并想要显示 html 数据时,ReactJS 都会将其显示为文本。(见下图)

ReactJS 渲染字符串

通过jquery Ajax的success回调函数显示数据。

$.ajax({
   url: url here,
   dataType: "json",
   success: function(data) {
      this.setState({
           action: data.action
      })
   }.bind(this)
});

在此处输入图片说明

有什么简单的方法可以将其转换为 html?我应该如何使用 ReactJS 做到这一点?

6个回答

默认情况下,React 会转义 HTML 以防止XSS(跨站点脚本)如果你真的想呈现 HTML,你可以使用dangerouslySetInnerHTML属性:

<td dangerouslySetInnerHTML={{__html: this.state.actions}} />

React 强制使用这种有意繁琐的语法,这样您就不会意外地将文本呈现为 HTML 并引入 XSS 错误。

此语法显示在主页和教程中,但我刚刚意识到它没有在其他任何地方记录,所以我只是提交了#413来修复。
2021-03-16 00:24:56
正确的!我已经使用危险的SetInnerHTML解决了这个问题,但还是谢谢:)
2021-04-05 00:24:56
您可以尝试最简单的解决方案stackoverflow.com/questions/19266197/...
2021-04-06 00:24:56
如果您从外部 API 获取该信息,那么使用npm 包中sanitize函数来安全地清理内容是值得的dompurify
2021-04-09 00:24:56
请注意,尽管它是“危险的”,如果您只是使用它从服务器呈现 html,它并不比在网页中显示该内容更危险。如果该内容具有用户提供的未经过清理的输入,并且如果它直接来自服务器,则您应该已经在后端进行了清理,则会出现危险。
2021-04-09 00:24:56

现在有更安全的方法来实现这一点。文档已更新,使用这些方法。

其他方法

  1. 最简单- 使用 Unicode,将文件另存为 UTF-8 并将 设置charset为 UTF-8。

    <div>{'First · Second'}</div>

  2. 更安全- 对 Javascript 字符串中的实体使用 Unicode 编号。

    <div>{'First \u00b7 Second'}</div>

    或者

    <div>{'First ' + String.fromCharCode(183) + ' Second'}</div>

  3. 或者带有字符串和 JSX 元素的混合数组。

    <div>{['First ', <span>&middot;</span>, ' Second']}</div>

  4. 最后的手段- 使用dangerouslySetInnerHTML.

    <div dangerouslySetInnerHTML={{__html: 'First &middot; Second'}} />

我已经准备好了文档,但是关于一个很长的 HTML 字符串,比如来自 WYSIWYG 编辑器的字符串?我看不出我们如何使用第一种、第二种或第三种方法
2021-03-18 00:24:56
对。这些带有硬编码“动态”内容的示例没有多大意义。
2021-03-20 00:24:56
我同意@eric。方法 1-3 对于存储在某处(例如数据库)的已转义内容有什么好处?另请注意,方法 4(唯一的方法)意味着您无法添加子节点。
2021-03-23 00:24:56
这是我的innerHTML - “显示管理员\u003cb\u003e1\u0026nbsp;-\u0026nbsp;10\u003c/b\u003e of \u003cb\u003e13\u003c/b\u003e 总计”,而这就是正在呈现的内容管理员 <b>1 - 10</b> 总共 <b>13</b>”。当我尝试使用危险的SetInnerHTML 时,一切都会中断。
2021-04-08 00:24:56

我建议使用交织产生的milesj它是一个非凡的库,它利用了一些巧妙的技术来解析 HTML 并将其安全地插入到 DOM 中。

Interweave 是一个react库,可以安全地呈现 HTML、过滤属性、使用匹配器自动换行文本、呈现表情符号字符等等。

  • Interweave 是一个强大的 React 库,它可以:
    • 在不使用危险的SetInnerHTML 的情况下安全地呈现HTML。
    • 安全地剥离 HTML 标签。
    • 自动 XSS 和注入保护。
    • 使用过滤器清理 HTML 属性。
    • 使用匹配器插入组件。
    • 自动链接 URL、IP、电子邮件和主题标签。
    • 渲染表情符号和表情符号。
    • 以及更多!

用法示例:

import React from 'react';
import { Markup } from 'interweave';

const articleContent = "<p><b>Lorem ipsum dolor laboriosam.</b> </p><p>Facere debitis impedit doloremque eveniet eligendi reiciendis <u>ratione obcaecati repellendus</u> culpa? Blanditiis enim cum tenetur non rem, atque, earum quis, reprehenderit accusantium iure quas beatae.</p><p>Lorem ipsum dolor sit amet <a href='#testLink'>this is a link, click me</a> Sunt ducimus corrupti? Eveniet velit numquam deleniti, delectus  <ol><li>reiciendis ratione obcaecati</li><li>repellendus culpa? Blanditiis enim</li><li>cum tenetur non rem, atque, earum quis,</li></ol>reprehenderit accusantium iure quas beatae.</p>"

<Markup content={articleContent} /> // this will take the articleContent string and convert it to HTML markup. See: https://milesj.gitbook.io/interweave


//to install package using npm, execute the command
npm install interweave
这方面的文档没有帮助。我也尝试了几行 html 并且我有一个充满错误消息的页面。有人有示例或任何带有文档的资源吗?
2021-03-14 00:24:56
您知道 Interweave 不涵盖哪些威胁吗?
2021-03-23 00:24:56
@ElAnonimo 我添加了一个使用示例。希望这能让事情更清楚一点。
2021-03-31 00:24:56
感谢一百万,交织正是我所需要的。干杯。
2021-04-05 00:24:56
你能提供一个使用示例吗?
2021-04-07 00:24:56
npm i html-react-parser;

import Parser from 'html-react-parser';

<td>{Parser(this.state.archyves)}</td>
这个库的最新版本提供了一种非常干净的 html 注入方式。replace方法是img用您自己的<Image/>组件替换(例如)标签的好方法
2021-03-22 00:24:56

对于那些仍在试验中的人, npm install react-html-parser

当我安装它时,它每周有 123628 次下载。

import ReactHtmlParser from 'react-html-parser'

<div>{ReactHtmlParser(htmlString)}</div>