小编典典

React:我可以操纵React渲染的DOM多少?

reactjs

这就是我在做什么:jsfiddle

关键部分是:

position: function() {
  var container = $(this.getDOMNode());
  this._menu = $(this.refs.menu.getDOMNode());
  this._menu.appendTo(document.body).
      offset({
          top: container.offset().top + 
              container.outerHeight(),
          left: container.offset().left
      });
},
restore: function() {
  this._menu.appendTo(this.getDOMNode());      
},
componentWillUpdate: function() {
  this.restore();
},
componentDidUpdate: function() {
  this.position();
},
componentDidMount: function() {
  this.position();
},

现在,这很好用。我在组件更新之前将内容放回原处,并假设React在每次更新之间都留有DOM,并且不会错过它。实际上,React似乎可以移动内容(如果我删除componentWillUpdatecomponentDidUpdate,则定位的元素仍会更新!)

我的问题是,有多少假设是安全的(即,如果我假设这些事情,我的代码会在React的未来版本中中断吗?):

  • 只要您将DOM放回原处,React就不会在更新之间移动DOM componentWillUpdate
  • React事件处理程序仍将对已移动的元素起作用。
  • React会将您要求的任何内联样式与元素上已经存在的样式合并(即使它没有设置它们)。
  • 即使您将DOM移动到文档中的其他位置,React也会更新它已经渲染的DOM!

对于我来说,最后一个似乎有些极端和神奇,但如果成立的话,则具有一些重大意义。


阅读 218

收藏
2020-07-22

共1个答案

小编典典

我是React开发人员 我将回答您的每个问题:


只要您将DOM重新放回componentWillUpdate中,React就不会在更新之间移动DOM。

正确-除了更新时,React不会查看DOM,事件处理程序除外:

React事件处理程序仍将对已移动的元素起作用。

我不会依靠这一点,而且我不确定现在是否如此。

React会将您要求的任何内联样式与元素上已经存在的样式合并(即使它没有设置它们)。

我也不会依赖它-现在React设置了单个属性,但是我可以很容易地想象它的设置el.style.cssText是否更快,这会破坏您所做的单个更改。

即使您将DOM移动到文档中的其他位置,React也会更新它已经渲染的DOM!

我不认为目前这是真的,您也不应该依赖于此。


广义上讲,您不应该手动操作React创建的DOM。<div>在React中创建一个空白并手动填充是100%的粗略操作;只要您以后不尝试在React中更改其属性(使React进行DOM更新),甚至可以修改React呈现的元素的属性,但是如果您移动一个元素,React可能会寻找并找不到时会感到困惑。

希望有帮助。

2020-07-22