React.js: Set innerHTML vs dangerouslySetInnerHTML

2022-08-30 00:20:46

在元素上设置innerHTML与设置insiouslySetInnerHTML属性有什么“幕后”区别吗?假设我为了简单起见而对事物进行了适当的消毒。

例:

var test = React.createClass({
  render: function(){
    return (
      <div contentEditable='true' dangerouslySetInnerHTML={{ __html: "Hello" }}></div>
    );
  }
});

var test = React.createClass({
  componentDidUpdate: function(prevProp, prevState){
    this.refs.test.innerHTML = "Hello";
  },
  render: function(){
    return (
      <div contentEditable='true' ref='test'></div>
    );
  }
});

我正在做一些比上面的例子更复杂的事情,但总体想法是一样的。


答案 1

是的,有区别!

使用 vs 的直接效果是相同的 - DOM 节点将使用注入的 HTML 进行更新。innerHTMLdangerouslySetInnerHTML

但是,当你使用它时,在幕后会让 React 知道该组件内部的 HTML 不是它关心的东西。dangerouslySetInnerHTML

因为 React 使用虚拟 DOM,所以当它将 diff 与实际的 DOM 进行比较时,它可以直接绕过对该节点的子节点的检查,因为它知道 HTML 来自另一个源。因此,性能得到了提高。

更重要的是,如果你只是简单地使用,React 没有办法知道 DOM 节点已经被修改了。下次调用该函数时,React 将覆盖手动注入的内容,其中包含它认为该 DOM 节点的正确状态。innerHTMLrender

我相信,用于始终确保内容同步的解决方案会起作用,但在每次渲染期间可能会有闪光。componentDidUpdate


答案 2

您可以直接绑定到 dom

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