2016-08-26 14:42:41 +08:00
---
category: Components
2022-11-09 12:28:04 +08:00
group: Navigation
2016-08-26 15:07:46 +08:00
title: Menu
2022-11-30 20:14:41 +08:00
cover: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*KeyQQL5iKkkAAAAAAAAAAAAADrJ8AQ/original
2023-02-09 22:17:31 +08:00
coverDark: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*Vn4XSqJFAxcAAAAAAAAAAAAADrJ8AQ/original
2016-08-26 14:42:41 +08:00
---
2019-10-28 09:09:22 +08:00
A versatile menu for navigation.
2016-08-26 14:42:41 +08:00
2016-09-10 13:43:30 +08:00
## When To Use
2016-08-26 14:42:41 +08:00
2021-07-19 16:21:09 +08:00
Navigation is an important part of any website, as a good navigation setup allows users to move around the site quickly and efficiently. Ant Design offers two navigation options: top and side. Top navigation provides all the categories and functions of the website. Side navigation provides the multi-level structure of the website.
2016-08-26 14:42:41 +08:00
2019-10-28 09:09:22 +08:00
More layouts with navigation: [Layout ](/components/layout ).
2017-06-30 21:10:47 +08:00
2021-06-30 18:04:15 +08:00
## Notes for developers
2021-07-19 16:21:09 +08:00
- Menu is rendered as a `ul` element, so it only supports [`li` and `script-supporting` elements ](https://html.spec.whatwg.org/multipage/grouping-content.html#the-ul-element ) as children nodes。Your customized node should be wrapped by `Menu.Item` .
- Menu needs to collect its node structure, so its children should be `Menu.*` or encapsulated HOCs.
2021-06-22 11:22:20 +08:00
2022-11-09 12:28:04 +08:00
## Examples
2022-11-17 17:31:26 +08:00
<!-- prettier - ignore -->
2022-11-09 12:28:04 +08:00
< code src = "./demo/horizontal.tsx" > Top Navigation< / code >
2023-01-09 16:50:08 +08:00
< code src = "./demo/horizontal-dark.tsx" debug > Top Navigation (dark)< / code >
2022-11-09 12:28:04 +08:00
< code src = "./demo/inline.tsx" > Inline menu< / code >
< code src = "./demo/inline-collapsed.tsx" > Collapsed inline menu< / code >
< code src = "./demo/sider-current.tsx" > Open current submenu only< / code >
< code src = "./demo/vertical.tsx" > Vertical menu< / code >
< code src = "./demo/theme.tsx" > Menu Themes< / code >
< code src = "./demo/submenu-theme.tsx" > Sub-menu theme< / code >
< code src = "./demo/switch-mode.tsx" > Switch the menu type< / code >
< code src = "./demo/style-debug.tsx" debug > Style debug< / code >
< code src = "./demo/menu-v4.tsx" debug > Menu v4< / code >
2023-06-06 16:11:18 +08:00
< code src = "./demo/component-token.tsx" debug > Component Token< / code >
2022-11-09 12:28:04 +08:00
2022-04-20 22:31:21 +08:00
## API
2023-08-08 18:27:48 +08:00
Common props ref: [Common props](/docs/react/common-props)
2017-06-16 16:56:03 +08:00
### Menu
2016-08-26 14:42:41 +08:00
2022-11-17 17:31:26 +08:00
| Param | Description | Type | Default value | Version |
| --- | --- | --- | --- | --- |
| defaultOpenKeys | Array with the keys of default opened sub menus | string\[] | - | |
| defaultSelectedKeys | Array with the keys of default selected menu items | string\[] | - | |
| expandIcon | custom expand icon of submenu | ReactNode \| `(props: SubMenuProps & { isSubMenu: boolean }) => ReactNode` | - | 4.9.0 |
| forceSubMenuRender | Render submenu into DOM before it becomes visible | boolean | false | |
| inlineCollapsed | Specifies the collapsed status when menu is inline mode | boolean | - | |
| inlineIndent | Indent (in pixels) of inline menu items on each level | number | 24 | |
2022-12-22 14:12:26 +08:00
| items | Menu item content | [ItemType\[\]](#itemtype) | - | 4.20.0 |
2022-11-17 17:31:26 +08:00
| mode | Type of menu | `vertical` \| `horizontal` \| `inline` | `vertical` | |
| multiple | Allows selection of multiple items | boolean | false | |
| openKeys | Array with the keys of currently opened sub-menus | string\[] | - | |
| overflowedIndicator | Customized the ellipsis icon when menu is collapsed horizontally | ReactNode | `<EllipsisOutlined />` | |
| selectable | Allows selecting menu items | boolean | true | |
| selectedKeys | Array with the keys of currently selected menu items | string\[] | - | |
| style | Style of the root node | CSSProperties | - | |
| subMenuCloseDelay | Delay time to hide submenu when mouse leaves (in seconds) | number | 0.1 | |
| subMenuOpenDelay | Delay time to show submenu when mouse enters, (in seconds) | number | 0 | |
| theme | Color theme of the menu | `light` \| `dark` | `light` | |
| triggerSubMenuAction | Which action can trigger submenu open/close | `hover` \| `click` | `hover` | |
| onClick | Called when a menu item is clicked | function({ item, key, keyPath, domEvent }) | - | |
| onDeselect | Called when a menu item is deselected (multiple mode only) | function({ item, key, keyPath, selectedKeys, domEvent }) | - | |
| onOpenChange | Called when sub-menus are opened or closed | function(openKeys: string\[]) | - | |
| onSelect | Called when a menu item is selected | function({ item, key, keyPath, selectedKeys, domEvent }) | - | |
2016-08-26 14:42:41 +08:00
> More options in [rc-menu](https://github.com/react-component/menu#api)
2022-03-18 15:20:35 +08:00
### ItemType
> type ItemType = [MenuItemType](#MenuItemType) | [SubMenuType](#SubMenuType) | [MenuItemGroupType](#MenuItemGroupType) | [MenuDividerType](#MenuDividerType);
#### MenuItemType
2016-08-26 14:42:41 +08:00
2021-06-22 11:22:20 +08:00
| Param | Description | Type | Default value | Version |
| -------- | ------------------------------------ | --------- | ------------- | ------- |
2022-03-18 15:20:35 +08:00
| danger | Display the danger style | boolean | false | |
2021-06-22 11:22:20 +08:00
| disabled | Whether menu item is disabled | boolean | false | |
2022-03-18 15:20:35 +08:00
| icon | The icon of the menu item | ReactNode | - | |
2021-06-22 11:22:20 +08:00
| key | Unique ID of the menu item | string | - | |
2022-03-18 15:20:35 +08:00
| label | Menu label | ReactNode | - | |
2021-06-22 11:22:20 +08:00
| title | Set display title for collapsed item | string | - | |
2020-04-26 23:16:15 +08:00
2022-03-18 15:20:35 +08:00
#### SubMenuType
2016-08-26 14:42:41 +08:00
2022-11-25 14:23:11 +08:00
<!-- prettier - ignore -->
2022-11-24 12:04:05 +08:00
| Property | Description | Type | Default value | Version |
| --- | --- | --- | --- | --- |
2022-12-22 14:12:26 +08:00
| children | Sub-menus or sub-menu items | [ItemType\[\]](#itemtype) | - | |
2022-11-17 17:31:26 +08:00
| disabled | Whether sub-menu is disabled | boolean | false | |
| icon | Icon of sub menu | ReactNode | - | |
| key | Unique ID of the sub-menu | string | - | |
| label | Menu label | ReactNode | - | |
| popupClassName | Sub-menu class name, not working when `mode="inline"` | string | - | |
| popupOffset | Sub-menu offset, not working when `mode="inline"` | \[number, number] | - | |
| theme | Color theme of the SubMenu (inherits from Menu by default) | | `light` \| `dark` | - | |
| onTitleClick | Callback executed when the sub-menu title is clicked | function({ key, domEvent }) | - | |
2016-08-26 14:42:41 +08:00
2022-03-18 15:20:35 +08:00
#### MenuItemGroupType
Define `type` as `group` to make as group:
```ts
const groupItem = {
type: 'group', // Must have
label: 'My Group',
2022-05-09 18:09:02 +08:00
children: [],
2022-03-18 15:20:35 +08:00
};
```
2016-08-26 14:42:41 +08:00
2022-12-22 14:12:26 +08:00
| Param | Description | Type | Default value | Version |
| -------- | ---------------------- | --------------------------------- | ------------- | ------- |
| children | Sub-menu items | [MenuItemType\[\]](#menuitemtype) | - | |
| label | The title of the group | ReactNode | - | |
2022-03-18 15:20:35 +08:00
#### MenuDividerType
2016-11-15 14:12:25 +08:00
2022-03-18 15:20:35 +08:00
Divider line in between menu items, only used in vertical popup Menu or Dropdown Menu. Need define the `type` as `divider` :
2016-11-15 14:12:25 +08:00
2022-03-18 15:20:35 +08:00
```ts
const dividerItem = {
type: 'divider', // Must have
};
```
2021-06-22 11:22:20 +08:00
2021-07-19 15:42:07 +08:00
| Param | Description | Type | Default value | Version |
| ------ | ---------------------- | ------- | ------------- | ------- |
2022-03-18 15:20:35 +08:00
| dashed | Whether line is dashed | boolean | false | |
2021-07-19 15:42:07 +08:00
2021-06-22 11:22:20 +08:00
## FAQ
2021-07-19 16:21:09 +08:00
### Why will Menu's children be rendered twice?
2021-06-22 11:22:20 +08:00
2021-07-19 16:21:09 +08:00
Menu collects structure info with [twice-render ](https://github.com/react-component/menu/blob/f4684514096d6b7123339cbe72e7b0f68db0bce2/src/Menu.tsx#L543 ) to support HOC usage. Merging into one render may cause the logic to become much more complex. Contributions to help improve the collection logic are welcomed.
2022-07-20 10:58:47 +08:00
### Why Menu do not responsive collapse in Flex layout?
Menu will render fully item in flex layout and then collapse it. You need tell flex not consider Menu width to enable responsive ([online demo](https://codesandbox.io/s/ding-bu-dao-hang-antd-4-21-7-forked-5e3imy?file=/demo.js)):
```jsx
< div style = {{ flex } } >
< div style = {{ . . . } } > Some Content< / div >
< Menu style = {{ minWidth: 0 , flex: " auto " } } / >
< / div >
```
2023-03-27 15:33:22 +08:00
## Design Token
< ComponentTokenTable component = "Menu" > < / ComponentTokenTable >