javascript - 如何管理多个导航项状态?

标签 javascript reactjs antd

我正在尝试使用 antd 组件实现水平菜单。

单击nav 项时,子菜单未正确显示。

Codesandbox demo .

enter image description here

const MenuList = [
  {
    name: "Navigation two - Submenu",
    subMenuRoutes: [
      {
        name: "A- item1",
        url: "/item1Url1"
      },
      {
        name: "A - item2",
        url: "/item1Url2"
      }
    ]
  },
  {
    name: "Navigation Three - Submenu",
    subMenuRoutes: [
      {
        name: "B- item1",
        url: "/item1Url1"
      },
      {
        name: "B - item2",
        url: "/item1Url2"
      }
    ]
  }
];

function TextAreaManager() {
  const [showMenu, setShowMenu] = useState(false);
  return (
    <Tabs onTabClick={() => setShowMenu(prev => !prev)}>
      {MenuList.map(item => {
        return (
          <TabPane
            tab={
              <>
                <Icon type="setting" />
                {item.name}
                <Icon
                  type={showMenu ? "up" : "down"}
                  style={{ marginLeft: "10px" }}
                />
              </>
            }
          >
            {showMenu && (
              <Menu>
                {item.subMenuRoutes.map(childItem => {
                  return (
                    <Menu.Item key={childItem.url}>{childItem.name}</Menu.Item>
                  );
                })}
              </Menu>
            )}
          </TabPane>
        );
      })}
    </Tabs>
  );

最佳答案

有几个问题需要处理:

  1. 为每个数组项分配唯一的键,以便正确渲染组件。

    menuList.map(item => <TabPane key={item.name}></TabPane>);

  2. 您需要管理每个菜单的状态,以便使用相应的图标正确显示菜单 showMenuManager[item.name] :

<Tabs
  onTabClick={e =>
    setShowMenuManager(prev => {
      const newState = { ...initMenuState, [e]: !prev[e] };
      console.log(newState);
      return newState;
    })
  }
/>;
const initMenuState = {
 "Navigation two - Submenu": false,
 "Navigation Three - Submenu": false
};

function TopMenuManager() {
 const [showMenuManager, setShowMenuManager] = useState(initMenuState);
 return (
   <Tabs ... >
     {menuList.map(item => (
       <TabPane
         key={item.name}
         tab={
           <>
             ...
             <Icon
               type={showMenuManager[item.name] ? "up" : "down"}
             />
           </>
         }
       >
         {showMenuManager[item.name] && ...}
       </TabPane>
     ))}
   </Tabs>
 );
}

查看最终example和 fork 沙箱:

Edit Q-56637369-AntdTopMenuManage

关于javascript - 如何管理多个导航项状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56760820/

相关文章:

javascript - 在 javascript 中将 null 作为参数传递给 replace() 时表现怪异吗?

javascript - jquery click 不适用于 IE11 中动态添加的 href

javascript - 当将禁用的输入从 true 更改为 false 时,为什么我无法单击该输入?

javascript - 如何从单个构建加载单独的组件

reactjs - 类型错误 : WebAssembly. 实例化():导入 #0 模块 ="env"错误:模块不是对象或函数

reactjs - 在 Sider 中的 Ant Design Menu 中重置 openKeys 的问题

javascript - 修改后的二分搜索与最佳猜测

javascript - redux 是如何存储数据的?

javascript - ant design - 在 "cancel"和 "X"关闭按钮上重置模态值 - API RESPONSE BASE REACT JS

css - 如何使 <Col> 内的文本垂直对齐 <img> 的大小? ( Ant 设计)