这就是我在做什么: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似乎可以移动内容(如果我删除componentWillUpdate和componentDidUpdate,则定位的元素仍会更新!)
componentWillUpdate
componentDidUpdate
我的问题是,有多少假设是安全的(即,如果我假设这些事情,我的代码会在React的未来版本中中断吗?):
对于我来说,最后一个似乎有些极端和神奇,但如果成立的话,则具有一些重大意义。
我是React开发人员 我将回答您的每个问题:
只要您将DOM重新放回componentWillUpdate中,React就不会在更新之间移动DOM。
正确-除了更新时,React不会查看DOM,事件处理程序除外:
React事件处理程序仍将对已移动的元素起作用。
我不会依靠这一点,而且我不确定现在是否如此。
React会将您要求的任何内联样式与元素上已经存在的样式合并(即使它没有设置它们)。
我也不会依赖它-现在React设置了单个属性,但是我可以很容易地想象它的设置el.style.cssText是否更快,这会破坏您所做的单个更改。
el.style.cssText
即使您将DOM移动到文档中的其他位置,React也会更新它已经渲染的DOM!
我不认为目前这是真的,您也不应该依赖于此。
广义上讲,您不应该手动操作React创建的DOM。<div>在React中创建一个空白并手动填充是100%的粗略操作;只要您以后不尝试在React中更改其属性(使React进行DOM更新),甚至可以修改React呈现的元素的属性,但是如果您移动一个元素,React可能会寻找并找不到时会感到困惑。
<div>
希望有帮助。