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

React项目中Ant Design Dropdown子菜单项点击保持展开的实现问询

解决Ant Design Dropdown子菜单点击后保持展开的问题

针对React中Ant Design Dropdown带二级子菜单时,点击子菜单项菜单自动关闭的问题,提供两种可行方案,适配官方推荐的menu属性:

方案一:受控模式手动控制菜单可见性

通过维护Dropdown的visible状态,在菜单点击事件中区分一级菜单项和子菜单项,仅在点击一级菜单项时关闭菜单:

import { useState } from 'react';
import { Dropdown, Menu } from 'antd';

const CustomDropdown = () => {
  const [dropdownVisible, setDropdownVisible] = useState(false);

  const handleMenuClick = (menuEvent) => {
    // 根据菜单项key区分是否为子菜单项(可自定义规则)
    if (!menuEvent.key.includes('sub')) {
      // 点击一级菜单项时关闭菜单
      setDropdownVisible(false);
    }
    // 子菜单项点击后不修改visible状态,保持展开
  };

  const handleOpenChange = (newVisible) => {
    setDropdownVisible(newVisible);
  };

  const dropdownMenu = (
    <Menu onClick={handleMenuClick}>
      <Menu.SubMenu title="分组菜单">
        <Menu.Item key="sub-item-1">子选项1</Menu.Item>
        <Menu.Item key="sub-item-2">子选项2</Menu.Item>
      </Menu.SubMenu>
      <Menu.Item key="normal-item">普通一级选项</Menu.Item>
    </Menu>
  );

  return (
    <Dropdown
      menu={dropdownMenu}
      visible={dropdownVisible}
      onOpenChange={handleOpenChange}
    >
      <a style={{ cursor: 'pointer' }}>点击展开菜单</a>
    </Dropdown>
  );
};

export default CustomDropdown;

方案二:优化stopPropagation覆盖全菜单项空间

针对你之前尝试的stopPropagation方法存在的点击边缘失效问题,只需让包裹的容器占满整个菜单项的空间,确保点击任何区域都能阻止事件冒泡:

import { Dropdown, Menu } from 'antd';

const CustomDropdown = () => {
  const dropdownMenu = (
    <Menu>
      <Menu.SubMenu title="分组菜单">
        <Menu.Item key="sub-item-1">
          <div 
            style={{
              width: '100%',
              height: '100%',
              padding: '8px 16px', // 对齐Ant Design默认菜单项内边距
              cursor: 'pointer'
            }}
            onClick={(e) => e.stopPropagation()}
          >
            子选项1
          </div>
        </Menu.Item>
        <Menu.Item key="sub-item-2">
          <div 
            style={{
              width: '100%',
              height: '100%',
              padding: '8px 16px',
              cursor: 'pointer'
            }}
            onClick={(e) => e.stopPropagation()}
          >
            子选项2
          </div>
        </Menu.Item>
      </Menu.SubMenu>
      <Menu.Item key="normal-item">普通一级选项</Menu.Item>
    </Menu>
  );

  return (
    <Dropdown menu={dropdownMenu}>
      <a style={{ cursor: 'pointer' }}>点击展开菜单</a>
    </Dropdown>
  );
};

export default CustomDropdown;

两种方案都无需使用已废弃的overlay属性,完全适配当前Ant Design的推荐用法。方案一适合需要精细控制菜单显示逻辑的场景,方案二更简单直接,适合快速修复点击边缘失效的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:36:12