根据React-Bootstrap Overlays 文档,如果目标是内联的,则覆盖的目标应该是the element the overlay is positioned in relation to
可以很好地工作的。例如下面的示例 1。
但是,如果引用的 dom 项目包含在另一个组件中,如示例 2所示,则引用设置不正确,并且弹出框没有正确定位。
起初我没有转发 ref,并认为这是我的问题,但即使根据React.forwardRef 文档修复了该问题, ref 仍然无法正常工作。
可能的解决方案:我可以将目标倾斜而不是另一个组件,但这消除了能够在 React 中使用组件的目的。
我可能在这个设置的某个地方错过了一小步,我只是不知道在哪里。
当我写这个并寻找重复项时,我确实找到了一个替代的工作解决方案。正如Simon Arsenault 的回答中所见,通过将组件包装在 dom 元素中,我可以使用该 dom 元素作为示例 3中所示的 ref
我仍然想知道为什么 forwardRef 似乎不起作用。
示例 1:工作
...
export default (props) => {
const [show, setShow] = useState(false)
const target = useRef(null)
...
return (
<div>
<p ref={target} >Click Me</p>
<Overlay show={show} target={target.current} >
<Popover id='123'>
...
</Popover>
</Overlay>
</div>
)
}
示例 2:不工作
...
export default (props) => {
const [show, setShow] = useState(false)
const target = useRef(null)
...
return (
<div>
<LinkIcon ref={target} />
<Overlay show={show} target={target.current} >
<Popover id='123'>
...
</Popover>
</Overlay>
</div>
)
}
...
const LinkIcon = React.forwardRef((props, ref) => {
...
return (
<div ref={ref}>
...
</div>
)
})
示例 3:工作
...
export default (props) => {
const [show, setShow] = useState(false)
const target = useRef(null)
...
return (
<div>
<div ref={target}><LinkIcon /></div>
<Overlay show={show} target={target.current} >
<Popover id='123'>
...
</Popover>
</Overlay>
</div>
)
}
...
const LinkIcon = React.forwardRef((props, ref) => {
...
return (
<div ref={ref}>
...
</div>
)
})
PS:是的,我知道这不是一个完全有效的示例,因为我没有使用 Overlay 的show
属性,但它工作正常,为简洁起见,在此代码片段中省略了。