解决antd side侧边栏菜单收缩时二级菜单不跟随

本文分享了如何修复React中Sider组件在切换折叠状态时二级菜单选中项回闪的问题,通过useState和useEffect结合实现动态调整openKeys。适合遇到类似bug的开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bug

我又回来了,BUG BUG BUG…
借用下图片,大概就是这种bug,直接看怎么解决吧,简单记录一下,有遇到相同问题的可以试试我这样的方法。

在这里插入图片描述

解决!

import React, { memo, useMemo, useState, useEffect } from "react";
import { useNavigate, useLocation } from "react-router-dom";
import { useSelector, shallowEqual } from "react-redux";
import { Layout, Menu } from "antd";
import { SildeMenuWrapper } from "./style";
import { mapIconMenus, deepCopy } from "@/utils/devUtils";
const { Sider } = Layout;

const SideMenu = memo((props: any) => {
  const location = useLocation();
  // 路由路径
  const path = location.pathname;
  // 默认展开的父节点菜单路径
  const selectOpen = "/" + (path && path.split("/")[1]);
  // 用于监听 props.collapsed 改变 在改变前处理 二级菜单选中回闪的bug
  const [collapsed, setcollapsed] = useState(props.collapsed);
  //  动态改变openKeys的值
  const [menuProps, setmenuProps] = useState({});

  const { menus } = useSelector(
    (state: any) => ({
      menus: state.login.menus,
    }),
    shallowEqual
  );
  // 拿到处理后的菜单数据 先深拷贝再处理 不然会影响到redux中的值
  const endMenus = useMemo(() => mapIconMenus(deepCopy(menus)), [menus]);
  const navigate = useNavigate();
  // 选中菜单的回调
  const selectMenu = ({ key, domEvent }: any) => {
    navigate(key);
  };
  // 展开菜单的回调
  const openMenu = (opens: any) => {
    setmenuProps({ openKeys: opens });
  };
  // 用于监听 props.collapsed 改变 收缩前先关闭所有展开项 打开前先展开当前选中项
  useEffect(() => {
    if (!props.collapsed) {
      setcollapsed(props.collapsed);
      setTimeout(() => {
        setmenuProps({ openKeys: [selectOpen] });
      }, 0);
    } else {
      setmenuProps({ openKeys: [] });
      setcollapsed(props.collapsed);
    }
  }, [props.collapsed, selectOpen]);

  return (
    <SildeMenuWrapper>
      <Sider trigger={null} collapsible collapsed={collapsed} width={250}>
        <div className="all-menus">
          <div
            className="logo"
            style={{ display: collapsed ? "none" : "block" }}
          >
            全球新闻发布管理系统
          </div>
          <div className="menus">
            <Menu
              mode="inline"
              theme="dark"
              selectedKeys={[path]}
              defaultOpenKeys={[selectOpen]}
              {...menuProps}
              items={endMenus}
              onSelect={selectMenu}
              onOpenChange={openMenu}
            />
          </div>
        </div>
      </Sider>
    </SildeMenuWrapper>
  );
});

export default SideMenu;

核心代码都在上面,且有注释!
完整代码看此处项目源码

### 如何在 React 中用 Ant Design 实现带二级 Tab 菜单的顶部导航栏 为了实现在 React 应用中使用 Ant Design 组件库创建带有二级 Tab 菜单的顶部导航栏,可以遵循以下方法: #### 安装依赖包 首先,在项目根目录下安装 `antd` 及其对应的图标库。 ```bash npm install antd @ant-design/icons ``` #### 导入所需模块 接着,在项目的入口文件或组件文件里导入所需的 CSS 文件和 JS 模块。这一步骤确保了样式能够正常加载[^1]。 ```javascript import 'antd/dist/reset.css'; import { Tabs } from 'antd'; const { TabPane } = Tabs; ``` #### 创建顶层 Tabs 组件 定义一个包含多个子项的一级标签页容器,并为其设置默认激活状态。 ```jsx function TopLevelTabs() { const [activeKey, setActiveKey] = useState('tab1'); return ( <Tabs activeKey={activeKey} onChange={(key) => setActiveKey(key)}> {/* 添加更多的一级选项卡 */} <TabPane tab="一级菜单1" key="tab1"> Content of Tab Pane 1 </TabPane> <TabPane tab="一级菜单2" key="tab2"> Content of Tab Pane 2 </TabPane> </Tabs> ); } ``` #### 嵌套二级 Tabs 组件 针对特定的一级标签页内部嵌套另一个 `Tabs` 组件作为二级菜单结构的一部分。通过条件渲染来控制何显示此部分的内容。 ```jsx <TabPane tab="含二级菜单的一级菜单" key="nested-tabs"> <NestedSubTabs /> </TabPane> // NestedSubTabs.jsx export default function NestedSubTabs() { return ( <> <h3>这是含有二级菜单的一级页面内容。</h3> <Tabs defaultActiveKey="sub-tab1"> <TabPane tab="二级菜单A" key="sub-tab1">Content A</TabPane> <TabPane tab="二级菜单B" key="sub-tab2">Content B</TabPane> </Tabs> </> ); } ``` 上述代码片段展示了如何利用 Ant Design 的 `Tabs` 组件构建一个多层导航体系。需要注意的是实际应用场景可能更加复杂,因此建议开发者根据具体业务逻辑调整布局与交互方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值