更好的解决方案
更好的解决方案是用 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
和 中react@15.3.1
)。
唯一findDOMNode(component).getBoundingClientRect();
不使用的工作替代方案findDOMNode
是:
hover(props, monitor, component) {
...
component.decoratedComponentInstance._reactInternalInstance._renderedComponent._hostNode.getBoundingClientRect();
...
}
这不是很漂亮和危险,因为react
在未来的版本中可能会改变这个内部路径!
其他(较弱的)替代品
使用monitor.getDifferenceFromInitialOffset();
它不会给你精确的值,但如果你有一个小的dragSource可能已经足够了。然后根据您的dragSource的大小,返回的值是非常可预测的,误差很小。