【发布时间】:2014-06-25 04:37:39
【问题描述】:
这就是我正在做的事情: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 中中断吗?):
- React 不关心 DOM 是否在更新之间移动,只要您将其放回
componentWillUpdate。 - React 事件处理程序仍将处理已移动的元素。
- React 会将您要求的任何内联样式与元素上已有的样式合并(即使它没有设置它们。)
- React 将更新它已渲染的 DOM,即使您将该 DOM 移动到文档中的其他位置!
最后一个对我来说似乎有些极端和神奇,但如果它成立,就会产生一些重大影响。
【问题讨论】:
-
我真的很喜欢这个问题。它会询问我想要的所有东西以及更多。好东西!
-
您可以查看 react-bootstrap 如何实现似乎不受滚动区域影响的工具提示。我认为它会创建一个新的 div 并附加到正文,然后为该 div 渲染一个新的根,其中只有工具提示。这样,工具提示可以绝对定位在页面上的任何位置。