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

Antd v5 点击Tooltip触发MenuItem选中问题求助

解决Ant Design v5中Tooltip包裹MenuItem标签时点击触发选中的问题

问题场景

我使用Ant Design v5的Sider、Menu、Tooltip组件时,将MenuItem的标签用Tooltip包裹后出现了以下问题:

  • 鼠标悬停时Tooltip正常显示
  • 点击Tooltip区域会触发MenuItem的选中状态变更
  • 期望仅点击MenuItem本身(非Tooltip区域)时才触发选中状态切换,未在组件API中找到直接解决方法

问题代码

import React, { useState } from 'react';
import './index.css';
import { DesktopOutlined, PieChartOutlined } from '@ant-design/icons';
import { MenuProps, Tooltip } from 'antd';
import { Layout, Menu } from 'antd';

const { Sider } = Layout;

type MenuItem = Required<MenuProps>['items'][number];

function getItem(
  label: React.ReactNode,
  key: React.Key,
  icon?: React.ReactNode,
  children?: MenuItem[]
): MenuItem {
  return {
    key,
    icon,
    children,
    label,
  } as MenuItem;
}

const items: MenuItem[] = [
  getItem('Option 1', '1', <PieChartOutlined />),
  getItem(
    <Tooltip title="Test" placement="right">
      Option 2
    </Tooltip>,
    '2',
    <DesktopOutlined />
  ),
];

const App: React.FC = () => {
  const [collapsed, setCollapsed] = useState(false);

  return (
    <Layout style={{ minHeight: '100vh' }}>
      <Sider
        collapsible
        collapsed={collapsed}
        onCollapse={(value) => setCollapsed(value)}
      >
        <div className="demo-logo-vertical" />
        <Menu
          theme="dark"
          defaultSelectedKeys={['1']}
          mode="inline"
          items={items}
        />
      </Sider>
    </Layout>
  );
};

export default App;

解决方案

问题核心是Tooltip的点击事件会冒泡到父级MenuItem,导致触发选中状态变更。只需阻止Tooltip内部元素的事件冒泡即可,以下两种方案均可实现需求:

方案1:给Tooltip组件添加阻止冒泡事件

直接在Tooltip上绑定onClick事件,阻止事件向上传递:

const items: MenuItem[] = [
  getItem('Option 1', '1', <PieChartOutlined />),
  getItem(
    <Tooltip title="Test" placement="right" onClick={(e) => e.stopPropagation()}>
      Option 2
    </Tooltip>,
    '2',
    <DesktopOutlined />
  ),
];

方案2:给Tooltip内部的文本容器添加阻止冒泡事件

如果需要更精细的控制,可以将文本放在span标签中,给span添加阻止冒泡事件:

const items: MenuItem[] = [
  getItem('Option 1', '1', <PieChartOutlined />),
  getItem(
    <Tooltip title="Test" placement="right">
      <span onClick={(e) => e.stopPropagation()}>Option 2</span>
    </Tooltip>,
    '2',
    <DesktopOutlined />
  ),
];

两种方案都能实现:点击Tooltip的文本区域时不会触发MenuItem选中,点击MenuItem的图标、空白区域时仍可正常切换选中状态。

效果截图

效果截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:27:33