当前位置: 首页 > 知识库问答 >
问题:

使用reactjs呈现原始html

步兴德
2023-03-14

这是用reactjs呈现原始html的唯一方法吗?

// http://facebook.github.io/react/docs/tutorial.html
// tutorial7.js
var converter = new Showdown.converter();
var Comment = React.createClass({
  render: function() {
    var rawMarkup = converter.makeHtml(this.props.children.toString());
    return (
      <div className="comment">
        <h2 className="commentAuthor">
          {this.props.author}
        </h2>
        <span dangerouslySetInnerHTML={{__html: rawMarkup}} />
      </div>
    );
  }
});

我知道有一些很酷的方法用JSX标记东西,但我主要感兴趣的是能够渲染原始的html(所有的类,内联样式等)。像这样复杂的东西:

<!-- http://getbootstrap.com/components/#dropdowns-example -->
<div class="dropdown">
  <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true">
    Dropdown
    <span class="caret"></span>
  </button>
  <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Action</a></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Another action</a></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Something else here</a></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Separated link</a></li>
  </ul>
</div>

我不想在JSX中重写所有这些。

也许我对这一切的想法都错了。请纠正我。

共有3个答案

南门洋
2023-03-14

危险的是,React取代了在浏览器DOM中使用innerHTML。一般来说,从代码中设置HTML是有风险的,因为很容易在不经意间让用户遭受跨站点脚本(XSS)攻击。

在通过危险的LysetinerHTML将原始HTML注入DOM之前,最好/更安全地对其进行消毒(例如使用DOMPurify)。

DOMPurify-一个仅DOM,超快速,超容忍的XSS消毒器,适用于超文本标记语言,MathML和SVG。DOMPurify使用安全的默认值,但提供了大量的可配置性和钩子。

例子:

import React from 'react'
import createDOMPurify from 'dompurify'
import { JSDOM } from 'jsdom'

const window = (new JSDOM('')).window
const DOMPurify = createDOMPurify(window)

const rawHTML = `
<div class="dropdown">
  <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true">
    Dropdown
    <span class="caret"></span>
  </button>
  <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Action</a></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Another action</a></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Something else here</a></li>
    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Separated link</a></li>
  </ul>
</div>
`

const YourComponent = () => (
  <div>
    { <div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(rawHTML) }} /> }
  </div>
)

export default YourComponent
南门飞
2023-03-14

您可以利用html来响应npm模块。

注意:我是这个模块的作者,几个小时前刚刚发布。请随时报告任何错误或可用性问题。

萧光华
2023-03-14

现在有更安全的方法来呈现HTML。我在前面的回答中谈到了这一点。您有4个选项,最后一个选项使用了危险的HTML

超文本标记语言的渲染方法

>

<代码>

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

<代码>

<代码>

或者一个包含字符串和JSX元素的混合数组。

<代码>

最后一种方法-使用危险的HTML插入原始HTML

<代码>

 类似资料:
  • 问题内容: 那么这是用reactjs渲染原始html的唯一方法吗? 我知道有一些很酷的方法来用JSX标记内容,但是我主要对能够呈现原始html(具有所有类,内联样式等)感兴趣。像这样复杂的东西: 我不想在JSX中重写所有内容。 也许我在想这一切错。请纠正我。 问题答案: 您可以利用npm模块。 注意:我是该模块的作者,几小时前刚刚发布了该模块。请随时报告任何错误或可用性问题。

  • 我正在尝试在表FORNMAT中显示数据。数据来自API。我需要显示表一旦数据接收从api。我正在使用类组件。下面我给出了尝试的东西。 //下面是我的jsx //下面是我从api获取数据的函数 //下面是我的api输出

  • 假设我有: 我如何使它最终具有SMTH1行量,每个行包含SMTH2列量?

  • 我正在将我的页面从html和jquery迁移到使用React,我知道React Router和Redux是在构建React应用程序时处理路由的方法,但目前,我想知道如何更改设置,以便能够为不同的页面呈现不同的React组件。目前,我可以在加载索引页时呈现一个react组件,但我认为可以添加另一个在它下面,为不同页面上的组件指定不同的div id,但我注意到一个错误,。这与不使用react路由器或其

  • 我知道我可以在呈现组件时传递。我还知道方法。但问题是,不太有用,因为我的组件不知道它的初始状态。我有。所以我想在渲染的时候传递它。 类似这样的内容(伪代码): 我该怎么办? 假设我有一个组件。当我第一次呈现它时,初始状态与数据库中当前注释的快照相对应。当用户包含注释时,该列表将发生更改,这就是为什么它应该是而不是。现在,为了呈现注释的初始快照,我应该将它传递给组件,因为它无法知道它。我感到困惑的是

  • 我刚开始检查react表单。我遇到了一个问题,react在渲染中标记了我试图填充输入框标签的行。以下是我的应用程序代码: 在这一点上,我所要做的就是用名称输入框的标签为“您的名字”来呈现表单,如果没有输入名称,则让react用名称输入框的标签为“您需要输入您的名字”来重新呈现表单。 非常感谢任何援助。