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

Ant Design侧边栏父菜单选中颜色异常问题求助

问题描述

使用Ant Design + ReactJS开发侧边栏菜单时遇到以下问题:

  • 点击「Courses」的子项「All Courses」时,父菜单「Courses」默认变为绿色,与侧边栏背景色#2492EB重合,导致文字几乎不可见
  • 期望子菜单被选中时,父菜单文字保持白色
  • 已尝试Ant Design主题编辑器,未找到解决方法

问题截图

父菜单颜色异常(与背景色重合)
正常状态下的菜单

相关代码

侧边栏菜单配置

const adminSidebarItems: MenuProps["items"] = [
  {
    key: `/${role}/dashboard`,
    label: "Dashboard",
    icon: <MdOutlineDashboard />,
  },
  {
    key: `/${role}/students`,
    label: "Students",
    icon: <GoPeople />,
  },
  {
    key: `/${role}/courses`,
    label: "Courses",
    icon: <BsBook />,
    children: [
      {
        key: `/${role}/courses/`,
        label: "All Courses",
      },
    ],
  },
  {
    key: `/${role}/mentors`,
    label: "Mentors",
    icon: <IoPersonCircleOutline />,
  },
  {
    key: `/${role}/departments`,
    label: "Departments",
    icon: <LuFolders />,
  },
  {
    key: `/${role}/attendence`,
    label: "Attendence",
    icon: <PiIdentificationCard />,
  },
  {
    key: `/${role}/events`,
    label: "Events",
    icon: <BsCalendar2Event />,
  },
  ...defaultSidebarItems.slice(0, 1),
  {
    key: `/${role}/wallet`,
    label: "Wallet",
    icon: <HiOutlineCreditCard />,
  },
  {
    key: "/setting",
    label: "setting",
    icon: <IoSettingsOutline />,
  },
  ...defaultSidebarItems.slice(2),
];

仪表盘布局代码

const DashboardLayout = () => {
  const navigate = useNavigate();

  const { pathname } = useLocation();
  const [collapsed, setCollapsed] = useState(false);

  const { role } = getuser(userKey);

  const selectedKey =
    // @ts-ignore
    sidebarItems(role)?.find((item) => pathname.startsWith(item.key))?.key ||
    `/${role}/dashboard`;

  console.log(selectedKey);

  console.log(pathname);

  const {
    token: { colorBgContainer },
  } = theme.useToken();
  const handleMenuSelect = ({ key }: { key: string }) => {
    // setSelectedKey(key);
    if (key === "/logout") {
      removeUserInfo(userKey);
      navigate("/signin");
    } else {
      navigate(key);
    }
  };

  return (
    <ConfigProvider theme={sidebardThemes}>
      <Layout>
        <Sider
          width="220px"
          trigger={null}
          collapsible
          collapsed={collapsed}
          style={{
            backgroundColor: "#2492EB",
            height: "100vh",
            zIndex: 2,
            overflow: "auto",
            position: "fixed",
          }}
        >
          <div
            style={{
              display: "flex",
              flexDirection: "column",
              height: "inherit",
            }}
          >
            <div className="demo-logo-vertical" />
            <div
              style={{
                backgroundColor: "white",
                display: "flex",
                alignItems: "center",
                justifyContent: "center",
                height: "100px",
              }}
            >
              <img
                style={{
                  height: "40px",
                  width: "180px",
                }}
                src={logo}
                alt=""
              />
            </div>
            <Menu
              mode="inline"
              style={{
                backgroundColor: "#2492EB",
                color: "white",
                marginTop: "10px",
                flexGrow: 1,
                display: "flex",
                flexDirection: "column",
                paddingBlockEnd: "1rem",
                // height: "100%",
              }}
              selectedKeys={[pathname]}
              // defaultSelectedKeys={[sidebarItems[0].key]}
              // eslint-disable-next-line @typescript-eslint/ban-ts-comment
              // @ts-ignore
              items={sidebarItems(role)}
              onClick={handleMenuSelect}
            ></Menu>
          </div>
        </Sider>

        <Layout>
          <Content
            style={{
              paddingTop: "130px",
              paddingLeft: collapsed ? "130px" : "270px",
              paddingRight: "50px",
              background: "#F6F8FA",
              overflow: "auto",
            }}
          >
            <Outlet />
          </Content>
        </Layout>
      </Layout>
    </ConfigProvider>
  );
};
解决方案

这个问题是Ant Design Menu组件默认会给选中子项的父节点添加激活样式导致的,以下是三种可行的解决方式:

方式1:自定义CSS覆盖样式

给Menu组件添加自定义类名,然后强制覆盖父节点激活时的文字颜色:

// 在Menu组件上添加className
<Menu
  className="custom-sidebar-menu"
  // 其他属性保持不变
>

添加对应的CSS:

.custom-sidebar-menu .ant-menu-submenu-active > .ant-menu-submenu-title {
  color: #fff !important;
}

方式2:通过主题配置修改

在你的sidebardThemes中直接指定子菜单父节点的激活文字颜色:

const sidebardThemes = {
  components: {
    Menu: {
      // 子菜单标题激活时的文字颜色
      submenuTitleActiveColor: '#fff',
    },
  },
};

方式3:调整selectedKeys匹配逻辑

当前selectedKeys={[pathname]}会让Ant Design自动关联父节点,你可以只让最底层的子项被标记为选中:

// 编写方法精确匹配当前路径对应的子项key
const getExactSelectedKey = () => {
  const findExactKey = (items: MenuProps['items']) => {
    for (const item of items) {
      if (item.children) {
        const childKey = findExactKey(item.children);
        if (childKey) return childKey;
      }
      if (item.key === pathname) {
        return item.key;
      }
    }
    return null;
  };
  return findExactKey(sidebarItems(role)) || `/${role}/dashboard`;
};

// 使用精确匹配的key作为selectedKeys
<Menu
  selectedKeys={[getExactSelectedKey()]}
  // 其他属性保持不变
>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:25:08