Reactjs转换为html

Pet*_*ber 182 javascript ajax jquery reactjs react-jsx

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

ReactJS渲染字符串

数据通过jquery Ajax的成功回调函数显示.

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

在此输入图像描述

有没有简单的方法将其转换为HTML?我应该如何使用ReactJS?

Sop*_*ert 373

默认情况下,React会转义HTML以阻止XSS(跨站点脚本).如果您确实要呈现HTML,可以使用以下dangerouslySetInnerHTML属性:

<td dangerouslySetInnerHTML={{__html: this.state.actions}} />
Run Code Online (Sandbox Code Playgroud)

React强制这种有意识的麻烦语法,这样你就不会意外地将文本呈现为HTML并引入XSS错误.

  • 请注意,尽管它是“危险的”,但如果您只是使用它从服务器渲染 html,它并不比在网页中显示该内容更危险。如果该内容包含用户提供的尚未经过清理的输入,并且如果它直接来自服务器,那么您应该已经在后端进行了清理,就会出现危险。 (5认同)
  • 这个语法显示在主页和教程中,但我刚才意识到它没有在其他任何地方记录,所以我只是提交[#413](https://github.com/facebook/react/issues/413)来修复. (4认同)
  • 如果您从外部 API 获取该信息,那么使用“dompurify”npm 包中的“sanitize”函数来安全地清理内容是值得的。 (4认同)

Bre*_*ody 71

现在有更安全的方法来实现这一目标.该文档已更新,使用这些方法.

其他方法

  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. 最后的手段 - 使用原始HTML插入dangerouslySetInnerHTML.

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

  • 对.这些带有硬编码"动态"内容的示例并没有多大意义. (12认同)
  • 我已经准备好了文档,但是有一个很长的HTML字符串,例如来自WYSIWYG编辑器的HTML字符串?我看不出我们如何使用第一,第二或第三种方法 (11认同)
  • 我同意@eric.对于存储在某处的已经转义的内容,例如数据库,方法1-3有什么用?另请注意,方法4 - 唯一的方法 - 意味着您无法添加子节点. (4认同)

Arm*_*sch 22

我建议使用交织所创造milesj.它是一个非凡的库,它使用一些巧妙的技术来解析并安全地将HTML插入到DOM中.

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

  • Interweave是一个强大的React库,可以:
    • 无需使用dangerouslySetInnerHTML即可安全地呈现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
Run Code Online (Sandbox Code Playgroud)

  • @ElAnonimo 我添加了一个使用示例。希望这能让事情更清楚一点。 (2认同)
  • 感谢一百万,交织正是我所需要的。干杯。 (2认同)
  • 这方面的文档没有帮助。我还尝试了几行 html,结果页面充满了错误消息。有人有示例或任何带有文档的资源吗? (2认同)

小智 17

npm i html-react-parser;

import Parser from 'html-react-parser';

<td>{Parser(this.state.archyves)}</td>
Run Code Online (Sandbox Code Playgroud)


小智 8

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

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

import ReactHtmlParser from 'react-html-parser'

<div>{ReactHtmlParser(htmlString)}</div>
Run Code Online (Sandbox Code Playgroud)


Sun*_*mar 8

{[]}这可以通过使用像这样放入此块中的内容来解决。为了更清楚起见,可以参考下面的示例。

{[
   'abc',
   <b>my bold</b>, 
   'some other text'
]} 
Run Code Online (Sandbox Code Playgroud)

这将保留标签下文本的格式,而其他文本将打印为纯文本。


Pan*_*iou 6

如果要在 React 中呈现原始 html,可以使用以下命令

<div dangerouslySetInnerHTML={{__html: `html-raw-goes-here`}} />
Run Code Online (Sandbox Code Playgroud)

示例 - 渲染

考试是个好日子


Has*_*lak 5

i found this js fiddle. this works like this

function unescapeHTML(html) {
    var escapeEl = document.createElement('textarea');
    escapeEl.innerHTML = html;
    return escapeEl.textContent;
}

<textarea className="form-control redactor"
                          rows="5" cols="9"
                          defaultValue={unescapeHTML(this.props.destination.description)}
                          name='description'></textarea>
Run Code Online (Sandbox Code Playgroud)

jsfiddle link


Day*_*yan 5

我开始使用名为react-html-parser的npm包