更好的解决方案
更好的解决方案是只用 a 包装您的可拖动组件,在其div
上定义一个 ref 并将其传递给可拖动组件,即
<div key={key} ref={node => { this.node = node; }}>
<MyComponent
node={this.node}
/>
</div>
并且MyComponent
被包裹在DragSource
. 现在你可以使用
hover(props, monitor, component) {
...
props.node && props.node.getBoundingClientRect();
...
}
(props.node &&
只是为了避免调用getBoundingClientRect
未定义的对象而添加)
替代品findDOMNode
如果您不想添加 wrapping div
,可以执行以下操作。@imjared 的回复和这里建议的解决方案不起作用(至少在react-dnd@2.3.0
and中react@15.3.1
)。
findDOMNode(component).getBoundingClientRect();
唯一不使用的可行替代方案findDOMNode
是:
hover(props, monitor, component) {
...
component.decoratedComponentInstance._reactInternalInstance._renderedComponent._hostNode.getBoundingClientRect();
...
}
这不是很漂亮和危险,因为react
可能会在未来的版本中改变这个内部路径!
其他(较弱)替代品
使用monitor.getDifferenceFromInitialOffset();
which 不会给你精确的值,但如果你有一个小的dragSource可能就足够了。然后返回的值是相当可预测的,误差范围很小,具体取决于您的dragSource的大小。