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

React中HOC包裹图标组件时Tooltip需点击一次才显示问题

问题根因

Tooltip必须点击一次才正常显示的核心原因是高阶组件未正确透传ref。
MUI的Tooltip组件需要获取直接子元素的DOM引用,才能绑定mouseenter、mouseleave、focus等触发事件,监听悬停、聚焦状态控制提示框显隐。
当前componentGenerator实现中,虽然通过React.forwardRef接收了上层传入的ref,但渲染被包裹组件时没有把ref传递下去,Tooltip首次挂载时拿不到目标DOM节点,事件绑定失败;点击图标后组件触发焦点状态更新,Tooltip才重新拿到节点完成绑定,后续才能正常触发。

修复代码
  • 修改高阶组件,将接收到的ref透传给被包裹组件:
function componentGenerator(WrappedComponent) {
  function DynamicComponent(props, ref) {
    // 补充ref透传
    return <WrappedComponent ref={ref} {...props} />;
  }
  return React.forwardRef(DynamicComponent);
}
  • 补充自定义MyIcon组件的ref绑定,将ref挂载到真实渲染的IconButton节点上,避免其他依赖ref的场景出问题:
const MyIcon = React.forwardRef((props, ref) => {
  return (
    // 将ref绑定到实际的DOM宿主组件
    <IconButton ref={ref} {...props}>
      <Avatar alt="Not working" src="/static/images/avatar/2.jpg"/>
    </IconButton>
  );
});

注意:所有作为MUI Tooltip、Popover、Modal这类浮层组件直接子元素的自定义组件,都必须保证ref能正确透传到最外层的真实DOM节点,否则就会出现事件绑定异常、触发逻辑不符合预期的问题。修复后两个Tooltip行为完全一致,无需提前点击,鼠标悬停即可正常弹出提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:48:26