You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用rc-tooltip组件在Storybook中触发React.Children.only错误求助

排查React.Children.only错误的思路(基于rc-tooltip封装组件场景)

我基于rc-tooltip库封装了DefaultTooltip组件,代码如下:

const DefaultTooltip = (props: BaseTooltipProps) => {
  const {
    placement = "bottomRight",
    header,
    body,
    trigger = "hover",
    destroyTooltipOnHide = true,
    mouseLeaveDelay = 0,
  } = props;

  const overlay = header ? (
    <span>
      {header}
      {body}
    </span>
  ) : (
    <>
      <div>body</div>
    </>
  );

  return (
    <StyledTooltip
      placement={placement}
      overlay={overlay}
      trigger={trigger}
      destroyTooltipOnHide={destroyTooltipOnHide}
      mouseLeaveDelay={mouseLeaveDelay}
    />
  );
};

export default DefaultTooltip;

在Storybook中编写的示例代码:

export const TooltipStory: Story = () => {
  return (
    <div>
      TEST TEST TEST
      <Tooltip
        placement="bottomRight"
        header="test test test"
        body="ok ok ok"
        trigger="hover"
        destroyTooltipOnHide={true}
        mouseLeaveDelay={0}
      />
    </div>
  );
};

运行时出现错误提示:React.Children.only expected to receive a single React element child,已将Tooltip包裹在div中仍无法解决,以下是其他排查思路:

  • 检查rc-tooltip的核心要求:rc-tooltip组件必须接收单个React元素作为子节点(即触发提示显示的目标元素)。你当前的Story中,<Tooltip>没有包裹任何子元素,而是和文本TEST TEST TEST同级存在,这才是触发错误的根本原因,和外层div无关。

  • 修复DefaultTooltip的结构:封装的DefaultTooltip没有传递子元素给底层的StyledTooltip(rc-tooltip实例),需要修改组件逻辑,接收并传递子元素:

    const DefaultTooltip = (props: BaseTooltipProps & { children: React.ReactNode }) => {
      const {
        placement = "bottomRight",
        header,
        body,
        trigger = "hover",
        destroyTooltipOnHide = true,
        mouseLeaveDelay = 0,
        children, // 新增接收子元素属性
      } = props;
    
      // overlay逻辑保持不变
    
      return (
        <StyledTooltip
          placement={placement}
          overlay={overlay}
          trigger={trigger}
          destroyTooltipOnHide={destroyTooltipOnHide}
          mouseLeaveDelay={mouseLeaveDelay}
        >
          {children} {/* 将子元素传递给rc-tooltip */}
        </StyledTooltip>
      );
    };
    
  • 修正Storybook的使用方式:使用Tooltip时,必须把触发提示的元素作为Tooltip的子节点,而非让Tooltip单独存在:

    export const TooltipStory: Story = () => {
      return (
        <div>
          <Tooltip
            placement="bottomRight"
            header="test test test"
            body="ok ok ok"
            trigger="hover"
            destroyTooltipOnHide={true}
            mouseLeaveDelay={0}
          >
            <span>TEST TEST TEST</span> {/* 触发元素作为Tooltip的子节点 */}
          </Tooltip>
        </div>
      );
    };
    
  • 校验overlay的结构(次要):当前错误并非overlay导致,但如果后续body传入多个未包裹的元素,可能引发类似问题,建议始终用单个容器(如span、div)包裹overlay内容。

内容的提问来源于stack exchange,提问作者kastaplastislife

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:09:21