Как управлять несколькими состояниями элементов навигации? - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь реализовать горизонтальное меню с antd компонентами.

При нажатии на элементы nav подменю отображается некорректно.

Демонстрация Codesandbox .

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 Ответ

2 голосов
/ 25 июня 2019

Существует несколько проблем, которые необходимо решить:

  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>
 );
}

Проверьте окончательный пример и раздвоенную песочницу:

Edit Q-56637369-AntdTopMenuManage

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...