当前位置: 首页 > 面试题库 >

React.js:设置innerHTML vs危险地设置InnerHTML

冉丰茂
2023-03-14
问题内容

与在元素上设置元素的innerHTML与在元素上设置危险地设置InnerHTML属性有什么“幕后”区别?假设为简单起见,我正在对事物进行适当的消毒。

例:

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>
    );
  }
});

我做的事情比上面的示例复杂一些,但总体思路是相同的


问题答案:

是,有一点不同!

使用innerHTMLvs 的直接效果dangerouslySetInnerHTML是相同的-DOM节点将使用注入的HTML更新。

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

由于React使用虚拟DOM,因此当将差异与实际DOM进行比较时,它可以直接绕过检查该节点的子节点, 因为它知道HTML来自其他来源
。这样就可以提高性能。

更重要的是 ,如果仅使用innerHTML,React无法知道DOM节点已被修改。下次render调用该函数时, React将
使用它认为该DOM节点的正确状态应 覆盖的内容覆盖 手动注入 的内容

componentDidUpdate我认为可以始终确保内容同步的解决方案,我相信它可以工作,但是在每次渲染过程中可能会有闪光。



 类似资料:
  • 问题内容: 假设我有一个类,其中包含许多子类。 我可以实例化该类。然后,我可以将其属性设置为子类之一。我已经在活动对象上有效地将类类型更改为其子类的类型。我可以在其上调用调用这些方法的子类版本的方法。 那么,这样做有多危险?看起来很奇怪,但是这样做是 错误 的吗?尽管可以在运行时更改类型,但这是否应该完全避免该语言的功能?为什么或者为什么不? (根据回复,我将针对我想做什么以及是否有更好的选择发布

  • 问题内容: 在提交表单时,我正在尝试取代默认的发布行为。 显然,在React中,onSubmit是表单支持的事件。但是,当我尝试以下代码时: 该方法已运行,但是此后仍执行默认的发布行为。 您可以在我的jsfiddle中进行测试。 我的问题:如何防止默认的发布行为? 问题答案: 在您的函数中,传递事件并使用。

  • 本文向大家介绍在Bootstrap中的元素上设置橙色边框以指示危险,包括了在Bootstrap中的元素上设置橙色边框以指示危险的使用技巧和注意事项,需要的朋友参考一下 要将橙色边框设置为元素,请使用border-warning类- 设置元素的样式- 让我们看一个在Bootstrap中实现border-warning类的示例- 示例

  • 问题内容: 我正在用React制作电视指南。我正在从此API中获取表演信息:http : //api.tvmaze.com/episodes/333 如您所见,包含html。如果我渲染该字段。那么HTML将被解释为字符串,这意味着您可以在页面上看到标签等。 我知道我可以使用,但出于安全原因不建议使用。最佳做法是什么?从API获取格式化的文本并需要呈现它必须非常普遍。我很惊讶,没有一个过滤器,这将允

  • 问题内容: 我正在尝试在Django 1.2中使用local_setting ,但对我来说不起作用。目前,我只是将local_settings.py添加到我的项目中。 settings.py local_settings.py 问题在于local_settings.py不会覆盖settings.py。怎么了? 问题答案: 你不仅可以添加local_settings.py,还必须显式导入它。 在最后

  • 问题内容: 我正在尝试使用带有剑道分离器的Reactjs。拆分器的样式属性如下 使用Reactjs,如果我正确理解了所有内容,则可以使用内联样式来实现 但是,我也使用Dustin Getz jsxutil尝试将内容拆分成更多部分并具有独立的html片段。到目前为止,我有以下html片段(splitter.html) 和splitter.js组件,该组件按如下方式引用此html 现在,当我运行此命令