使用 React 变量语句 (JSX) 插入 HTML

IT技术 javascript html frontend reactjs react-jsx
2021-01-13 17:11:00

我正在用 React 构建一些东西,我需要在 JSX 中插入带有 React 变量的 HTML。有没有办法让变量像这样:

var thisIsMyCopy = '<p>copy copy copy <strong>strong copy</strong></p>';

并像这样将其插入react中,并使其工作?

render: function() {
    return (
        <div className="content">{thisIsMyCopy}</div>
    );
}

并让它按预期插入 HTML?我还没有看到或听到任何关于可以内联执行此操作的 react 函数,或一种解析允许此操作的方法的任何内容。

6个回答

您可以使用危险的SetInnerHTML,例如

render: function() {
    return (
        <div className="content" dangerouslySetInnerHTML={{__html: thisIsMyCopy}}></div>
    );
}
componentDidMount 中的普通 DOM 方法应该可以工作,但我以前没有这样做过。
2021-03-11 17:11:00
如果您需要向 中添加内容,这是如何工作的<head>
2021-03-19 17:11:00
确保将方法传递给危险的SetInnerHTML 而不是散列。根据文档,仅传递散列是危险的。参考:facebook.github.io/react/tips/dangerously-set-inner-html.html
2021-03-30 17:11:00
@DanielleMadeley 您是否要在 <head> 中插入条件 IE 注释?如果是这样,我已经成功使用这里描述的技巧:nemisj.com/conditional-ie-comments-in-react-js
2021-04-07 17:11:00
有没有不插入div的方法?
2021-04-10 17:11:00

请注意,dangerouslySetInnerHTML如果您不知道要注入的 HTML 字符串中的内容,这可能很危险。这是因为恶意客户端代码可以通过脚本标签注入。

如果您不能 100% 确定要呈现的 HTML 是 XSS(跨站点脚本)安全,那么通过DOMPurify等实用程序清理 HTML 字符串可能是个好主意

例子:

import DOMPurify from 'dompurify'

const thisIsMyCopy = '<p>copy copy copy <strong>strong copy</strong></p>';


render: function() {
    return (
        <div className="content" dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(thisIsMyCopy)}}></div>
    );
}
@vsync 不,它不应该:)
2021-03-20 17:11:00
是否可以不仅呈现 html 标签,还可以呈现库中的标签,例如 Material ui Alert 标签。我希望代码是这样的import DOMPurify from 'dompurify' const thisIsMyCopy = '<Alert severity="warning">copy copy copy <strong>strong copy</strong></Alert >'; render: function() { return ( <div className="content" dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(thisIsMyCopy)}}></div> ); }
2021-03-26 17:11:00
@sasharomanov,你有没有针对这种情况找到任何解决方案?
2021-03-28 17:11:00

risklySetInnerHTML有很多缺点,因为它设置在标签内部。

为此,我建议您使用一些 react 包装器,就像我在 npm 上找到的一样。 html-react-parser做同样的工作。

import Parser from 'html-react-parser';
var thisIsMyCopy = '<p>copy copy copy <strong>strong copy</strong></p>';


render: function() {
    return (
        <div className="content">{Parser(thisIsMyCopy)}</div>
    );
}

很简单的 :)

html-react-parser 似乎没有清理输入 - 请参阅常见问题解答
2021-03-29 17:11:00
“dangerouslySetInnerHTML 有很多缺点,因为它设置在标签内部。” 你能解释更多关于这个。试图找出 html-react-parser 和 sanatized innerHtml 之间的根本区别
2021-04-07 17:11:00

通过使用,''您将其变成一个字符串。使用不带引号的逗号可以正常工作。

const span = <span> whatever your string </span>

const dynamicString = "Hehe";
const dynamicStringSpan = <span> {`${dynamicString}`} </span>

render () {
  return (
    <div>

      {span}

      {dynamicStringSpan}

    </div>
  );
}
@checklist 请检查更新的答案,这是您想要的方式吗?
2021-03-16 17:11:00
这是最好的答案。谢了哥们!
2021-03-30 17:11:00
起初我笑了,然后给了它一个让我大吃一惊的机会
2021-04-01 17:11:00
到目前为止,最简单的答案尤其是如果 HTML 是由您编写的并且是基于用户输入动态的。你可以从字面上设置 var myHtml = <p>Some text</p>; 它有效
2021-04-05 17:11:00
你能添加要使用的实际代码吗?
2021-04-05 17:11:00
import { Fragment } from 'react' // react version > 16.0

var thisIsMyCopy = (
  <Fragment>
    <p>copy copy copy&nbsp;
    <strong>strong copy</strong>
    </p>
  </Fragment>
)

通过使用 '' 将值设置为字符串,React 无法知道它是一个 HTML 元素。您可以执行以下操作让 React 知道它是一个 HTML 元素 -

  1. 删除它'',它会工作
  2. 使用<Fragment>返回一个HTML元素。
这并没有回答这个问题。的内容thisIsMyCopy本身就是 JSX,而不是一串 HTML。所以你实际上是将 JSX 粘贴到 JSX 中。
2021-03-11 17:11:00
我认为这是最好的方法,因为我们不必使用这种方法将其存储为字符串变量。还要记住,dangerouslySetInnerHTML使用是危险的,因为恶意客户端代码可以通过脚本标签注入:stackoverflow.com/a/42380982/6908282
2021-03-19 17:11:00
您也可以在 Preact 中找到 Fragments,但仅限于版本 X 及更高版本。
2021-03-26 17:11:00