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

如何为单选按钮组中的禁用单选按钮显示Tooltip?

解决方案

要实现仅禁用的单选按钮显示Tooltip,需要将Tooltip从外层包裹整个组件的逻辑,改为针对单个禁用项单独包裹,具体修改步骤如下:

1. 修改父组件代码

移除外层包裹RadioListComponent的Tooltip,同时给每个单选项添加disabled状态标识,并将Tooltip内容通过props传递给子组件:

// 父组件代码
<RadioListComponent
  row
  aria-labelledby="classname"
  defaultValue="one"
  sx={{ /* 原有样式 */ }}
  // 传递Tooltip内容给子组件
  tooltipContent={
    <div>
      <span>Tooltip message</span>
      <a
        href={links}
        target="_blank"
        rel="noopener noreferrer"
        style={{ color: 'blue', textDecoration: 'underline' }}
      >
        linktext
      </a>
    </div>
  }
  items={listArray.map((option) => {
    const isDisabled = option.value === 'two' && !enabled;
    return ({
      ...option,
      disabled: isDisabled, // 添加禁用状态标识
      sx: {
        ...option.sx,
        pointerEvents: isDisabled ? 'none' : 'auto',
        opacity: isDisabled ? 0.5 : 1,
      },
    })
  })}
  {...field}
/>

2. 修改RadioListComponent组件

在子组件中接收tooltipContent props,遍历单选项时根据item.disabled判断是否包裹Tooltip,同时注意给禁用项添加pointerEvents: auto的外层容器(因为禁用项本身设置了pointerEvents: none,会导致Tooltip无法触发hover):

// RadioListComponent代码
import { Tooltip } from '@mui/material';

const Radio = forwardRef((props: RadioProps & { tooltipContent?: React.ReactNode }, ref: RefType) => {
  const { items, action, tooltipContent, ...radioGroupProps } = props;
  return (
    <MuiRadioGroup {...radioGroupProps} ref={ref}>
      {items.map((item, index) => {
        // 渲染基础单选项
        const radioItem = (
          <FormControlLabel
            value={item.value}
            onClick={action}
            control={<MuiRadio aria-label={item.label} />}
            label={
              <>
                <Typography component="span" sx={{ /* 原有样式 */ }}>
                  {item.label}
                </Typography>
                <Typography component="span" sx={{ /* 原有样式 */ }}>
                  {item.label}
                </Typography>
              </>
            }
            sx={item.sx}
          />
        );

        // 针对禁用项单独包裹Tooltip
        return item.disabled ? (
          <Tooltip
            key={index}
            title={tooltipContent}
            arrow
            placement="bottom-start"
          >
            <div style={{ pointerEvents: 'auto' }}>
              {radioItem}
            </div>
          </Tooltip>
        ) : (
          <React.Fragment key={index}>{radioItem}</React.Fragment>
        );
      })}
    </MuiRadioGroup>
  );
});

核心逻辑说明

  • 移除全局Tooltip:避免所有单选按钮触发Tooltip
  • 单个项判断:通过disabled标识精准控制Tooltip的显示范围
  • 修复hover触发问题:禁用项设置了pointerEvents: none,需要外层容器重新开启pointerEvents,才能让Tooltip感知到hover事件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:08:10