Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用Menu组件的Submenu,绑定了key,控制台报错Duplicated key 'undefined' used in Menu by path [] #33699

Closed
1 task
ztever opened this issue Jan 12, 2022 · 9 comments

Comments

@ztever
Copy link

ztever commented Jan 12, 2022

  • I have searched the issues of this repository and believe that this is not a duplicate.

Reproduction link

https://xx.com

Steps to reproduce

const RenderMenuItem: React.FC<{ list: DirectoryItem[] }> = ({ list }) => (
    <>
      {list.map((node: DirectoryItem) => (
        <SubMenu
          key={node.id}
          icon={
            <PlusSquareOutlined
              onClick={(evt: React.MouseEvent) => {
                evt.stopPropagation();
                clickPlus(node);
              }}
            />
          }
          title={node.name}
        >
        </SubMenu>
      ))}
    </>
  );

  return (
    <Menu
      defaultOpenKeys={defaultOpenKeys}
      defaultSelectedKeys={defaultSelectKeys}
      className={styles.menuList}
      mode="inline"
      style={{ borderRight: 0 }}
    >
      <RenderMenuItem list={menuData} />
    </Menu>
  );
};

What is expected?

submenue的key能成功帮定

What is actually happening?

node.id有值,但是submemu的key是undefined

Environment Info
antd 4.17.0
React 17.0
System macOS
Browser chrome 97.0.4692.71
@afc163
Copy link
Member

afc163 commented Jan 12, 2022

Duplicate of #4853

@afc163 afc163 marked this as a duplicate of #4853 Jan 12, 2022
@afc163
Copy link
Member

afc163 commented Jan 12, 2022

Try eventKey.

@afc163
Copy link
Member

afc163 commented Jan 12, 2022

const RenderMenuItem: React.FC<{ list: DirectoryItem[] }> = ({ list }) => (
    <>
      {list.map((node: DirectoryItem) => (
        <SubMenu
          key={node.id}
+         eventKey={node.id}
          icon={
            <PlusSquareOutlined
              onClick={(evt: React.MouseEvent) => {
                evt.stopPropagation();
                clickPlus(node);
              }}
            />
          }
          title={node.name}
        >
        </SubMenu>
      ))}
    </>
  );

  return (
    <Menu
      defaultOpenKeys={defaultOpenKeys}
      defaultSelectedKeys={defaultSelectKeys}
      className={styles.menuList}
      mode="inline"
      style={{ borderRight: 0 }}
    >
      <RenderMenuItem list={menuData} />
    </Menu>
  );
};

@afc163 afc163 closed this as completed Jan 12, 2022
@ztever
Copy link
Author

ztever commented Jan 13, 2022

const RenderMenuItem: React.FC<{ list: DirectoryItem[] }> = ({ list }) => (
    <>
      {list.map((node: DirectoryItem) => (
        <SubMenu
          key={node.id}
+         eventKey={node.id}
          icon={
            <PlusSquareOutlined
              onClick={(evt: React.MouseEvent) => {
                evt.stopPropagation();
                clickPlus(node);
              }}
            />
          }
          title={node.name}
        >
        </SubMenu>
      ))}
    </>
  );

  return (
    <Menu
      defaultOpenKeys={defaultOpenKeys}
      defaultSelectedKeys={defaultSelectKeys}
      className={styles.menuList}
      mode="inline"
      style={{ borderRight: 0 }}
    >
      <RenderMenuItem list={menuData} />
    </Menu>
  );
};

加上eventkey后,控制台会报Each child in a list should have a unique "key" prop.的错误

@ztever
Copy link
Author

ztever commented Jan 13, 2022

不用函数组件,就不会报错了

const MenuList = ({
  menuData,
  onClickPlus,
  onClickMenueItem,
  defaultOpenKeys,
  defaultSelectKeys,
}: {
  menuData: DirectoryItem[];
  defaultOpenKeys?: string[];
  defaultSelectKeys?: string[];
  onClickPlus: (value: DirectoryItem) => void;
  onClickMenueItem: (value: DirectoryItem, value2: DirectoryItem) => void;
}) => {
  const clickPlus = (item: DirectoryItem) => {
    onClickPlus(item);
  };
  const renderMenuItem = menuData.map((node: DirectoryItem) => (
    <SubMenu
      key={node.id}
      icon={
        <PlusSquareOutlined
          onClick={(e: React.MouseEvent) => {
            e.stopPropagation();
            clickPlus(node);
          }}
        />
      }
      title={node.name}
    >
      {node.children &&
        node.children.map((node2: DirectoryItem) => {
          return (
            <Menu.Item onClick={() => onClickMenueItem(node2, node)} key={node2.id}>
             //
            </Menu.Item>
          );
        })}
    </SubMenu>
  ));

  return (
    <Menu
      defaultOpenKeys={defaultOpenKeys}
      defaultSelectedKeys={defaultSelectKeys}
      className={styles.menuList}
      mode="inline"
      style={{ borderRight: 0 }}
    >
      {renderMenuItem}
    </Menu>
  );
};
export default MenuList;

@RyanWhipple
Copy link

Try eventKey.

Thanks, this worked for me! eventKey isn't listed as an API in the docs, either in SubMenu or Menu. Should this be updated?

https://ant.design/components/menu/

@zee-algo
Copy link

zee-algo commented Dec 9, 2022

Try eventKey.

Thanks a lot. It worked!

@phuctran2901
Copy link

eventKey current version is not provided anymore, is there any workaround anymore?

@khanisak
Copy link

@phuctran2901 did you find a workaround? on v5.0.7 eventKey props exist on Menu.Item but does
not exist on Menu.SubItem

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants