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