[英]Using React's forwardRef inline or as a component
我正在玩 React-Bootstrap 的OverlayTrigger
,它要求传递的子组件能够接收一个ref
(在文档中说明: https://react-bootstrap.github.io/components/overlays/#over )
我有以下工作代码:
const Acomponent = forwardRef((props, ref) => {
return (
<Button {...props} ref={ref}>
{props.children}
</Button>
);
});
const App = () => {
return (
<OverlayTrigger
key="right"
placement="right"
overlay={<Tooltip>Tooltip!!</Tooltip>}
>
<Acomponent>My component with a tooltip</Acomponent>
</OverlayTrigger>
);
};
有没有办法可以使用forwardRef
内联或作为组件来避免所有样板文件?
就像是:
const App = () => {
return (
<OverlayTrigger
key="right"
placement="right"
overlay={<Tooltip>Tooltip!!</Tooltip>}
>
{
forwardRef((props, ref) => {
<Button {...props} ref={ref}>My component with a tooltip</Button>
}
}
</OverlayTrigger>
);
};
或者:
const App = () => {
return (
<OverlayTrigger
key="right"
placement="right"
overlay={<Tooltip>Tooltip!!</Tooltip>}
>
<ForwardRefWrapper>
<Button>My component with a tooltip</Button>
</ForwardRefWrapper>
</OverlayTrigger>
);
};
在您的示例中, AComponent
只是呈现一个Button
而没有其他内容,并且Button
已经接受了一个 ref。 如果是这种情况,您应该能够删除AComponent
并执行以下操作:
<OverlayTrigger
key="right"
placement="right"
overlay={<Tooltip>Tooltip!!</Tooltip>}
>
<Button>My component with a tooltip</Button>
</OverlayTrigger>
但是有可能你简化了它来问你的问题,而AComponent
必须做更多的事情。 在这种情况下:不,没有更短的选择。
您的第一个示例不起作用,因为它会在每次App
呈现时创建一个全新的组件类型。 由于类型不断变化,因此每次都必须卸载和重新安装,在此过程中清除所有 state。
第二个不起作用,因为ForwardRefWrapper
具有与OverlayTrigger
相同的问题:如果您只是给了一个带有 function 组件元素的children
道具,则无法知道该 function 组件中的哪个元素 ref 是应该传递给。 没办法,除非您编写代码来这样做,这就是 forwardRef 的用途。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.