MenuTrigger and Menu
The MenuTrigger serves as a wrapper around a Menu and its associated trigger,
linking the Menu's open state with the trigger's press state.
The Menu allow users to choose from a list of options which can change based
on the content. Menus are used to display transient content such as options,
additional actions, and more. They stand out visually through stroke and drop
shadow and float on top of the interface.
install | yarn add @react-spectrum/menu |
---|---|
version | 3.0.0-rc.0 |
usage | import {Menu, MenuTrigger} from '@react-spectrum/menu' |
Example#
<MenuTrigger>
<ActionButton>
Edit
</ActionButton>
<Menu>
<Item>Cut</Item>
<Item>Copy</Item>
<Item>Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
Edit
</ActionButton>
<Menu>
<Item>Cut</Item>
<Item>Copy</Item>
<Item>Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
Edit
</ActionButton>
<Menu>
<Item>Cut</Item>
<Item>Copy</Item>
<Item>Paste</Item>
</Menu>
</MenuTrigger>
Content#
The Menu accepts Items and Sections
as children. Items can be
statically populated (initial example above) or dynamically (below). The dynamic
method would be better suited to use if the actions within a Menu came from a
data object such as values returned via an API call. A unique key
prop must be set
on each item.
<MenuTrigger>
<ActionButton>
Edit
</ActionButton>
<Menu items=[{name: 'Cut'} {name: 'Copy'} {name: 'Paste'}]>
item => <Item key= itemname> itemname</Item>
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>Edit</ActionButton>
<Menu
items=[
{name: 'Cut'}
{name: 'Copy'}
{name: 'Paste'}
]>
(item) => <Item key= itemname> itemname</Item>
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
Edit
</ActionButton>
<Menu
items=[
{name: 'Cut'}
{name: 'Copy'}
{name: 'Paste'}
]>
(item) => (
<Item
key=
itemname
>
itemname
</Item>
)
</Menu>
</MenuTrigger>
The MenuTrigger accepts exactly two children: the Menu and the element which triggers the opening of the Menu. The trigger must be the first child passed into the MenuTrigger and should be an element that supports press events.
If the Menu is open within a MenuTrigger it will close on blur or scroll events.
Selection#
Changes to the Menu's selected Item are propagated via the event onAction
.
The defaultSelectedKeys
prop can be used to preselect Menu Items in the Menu
placing selection of a Menu in an uncontrolled state. Alternatively, the
selectedKeys
prop preselects an Item in the Menu placing Item selection in a
controlled state.
<MenuTrigger closeOnSelect=false>
<ActionButton>
Edit (Controlled)
</ActionButton>
<Menu selectionMode="single" selectedKeys=['copy']>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect=false>
<ActionButton>
Edit (Uncontrolled)
</ActionButton>
<Menu selectionMode="single" defaultSelectedKeys=['paste']>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect=false>
<ActionButton>Edit (Controlled)</ActionButton>
<Menu selectionMode="single" selectedKeys=['copy']>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect=false>
<ActionButton>Edit (Uncontrolled)</ActionButton>
<Menu
selectionMode="single"
defaultSelectedKeys=['paste']>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger
closeOnSelect=
false
>
<ActionButton>
Edit (Controlled)
</ActionButton>
<Menu
selectionMode="single"
selectedKeys=[
'copy'
]>
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Menu>
</MenuTrigger>
<MenuTrigger
closeOnSelect=
false
>
<ActionButton>
Edit (Uncontrolled)
</ActionButton>
<Menu
selectionMode="single"
defaultSelectedKeys=[
'paste'
]>
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Menu>
</MenuTrigger>
The selectionMode
prop specifies how many Menu Items can be selected, with
the options being a single Menu Item, multiple Menu Items, or disabling selection
entirely (default).
<MenuTrigger closeOnSelect=false>
<ActionButton>
Show (Multiple)
</ActionButton>
<Menu selectionMode="multiple" defaultSelectedKeys=['Sidebar' 'Console']>
<Item key='Sidebar'>Sidebar</Item>
<Item key='Searchbar'>Searchbar</Item>
<Item key='Tools'>Tools</Item>
<Item key='Console'>Console</Item>
</Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect=false>
<ActionButton>
Edit (Selection Mode None)
</ActionButton>
<Menu selectionMode="none">
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect=false>
<ActionButton>Show (Multiple)</ActionButton>
<Menu
selectionMode="multiple"
defaultSelectedKeys=['Sidebar' 'Console']>
<Item key="Sidebar">Sidebar</Item>
<Item key="Searchbar">Searchbar</Item>
<Item key="Tools">Tools</Item>
<Item key="Console">Console</Item>
</Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect=false>
<ActionButton>Edit (Selection Mode None)</ActionButton>
<Menu selectionMode="none">
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger
closeOnSelect=
false
>
<ActionButton>
Show (Multiple)
</ActionButton>
<Menu
selectionMode="multiple"
defaultSelectedKeys=[
'Sidebar'
'Console'
]>
<Item key="Sidebar">
Sidebar
</Item>
<Item key="Searchbar">
Searchbar
</Item>
<Item key="Tools">
Tools
</Item>
<Item key="Console">
Console
</Item>
</Menu>
</MenuTrigger>
<MenuTrigger
closeOnSelect=
false
>
<ActionButton>
Edit (Selection
Mode None)
</ActionButton>
<Menu selectionMode="none">
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Menu>
</MenuTrigger>
Sections#
Menus may have Sections which can be used to wrap groups of Items. Each
Section
takes a title
and key
prop.
Static Items
<MenuTrigger>
<ActionButton>
Edit
</ActionButton>
<Menu>
<Section key="rollback" title="Rollback Options">
<Item key="undo">Undo</Item>
<Item key="redo">Redo</Item>
</Section>
<Section key="select" title="Selected Text Options">
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Section>
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
Edit
</ActionButton>
<Menu>
<Section key="rollback" title="Rollback Options">
<Item key="undo">Undo</Item>
<Item key="redo">Redo</Item>
</Section>
<Section key="select" title="Selected Text Options">
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Section>
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
Edit
</ActionButton>
<Menu>
<Section
key="rollback"
title="Rollback Options">
<Item key="undo">
Undo
</Item>
<Item key="redo">
Redo
</Item>
</Section>
<Section
key="select"
title="Selected Text Options">
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Section>
</Menu>
</MenuTrigger>
Dynamic Items
Sections should be populated with dynamic Items from a hierarchical data
structure. Section takes an array of data using the items
prop.
<MenuTrigger>
<ActionButton>File Types</ActionButton>
<Menu
items=[
{name: 'Docs' children: [{name: 'PDF'}]}
{
name: 'Images'
children: [{name: 'jpeg'} {name: 'png'} {name: 'tiff'}]
}
]>
(item) => (
<Section key= itemname items= itemchildren title= itemname>
(item) => <Item key= itemname> itemname</Item>
</Section>
)
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>File Types</ActionButton>
<Menu
items=[
{name: 'Docs' children: [{name: 'PDF'}]}
{
name: 'Images'
children: [
{name: 'jpeg'}
{name: 'png'}
{name: 'tiff'}
]
}
]>
(item) => (
<Section
key= itemname
items= itemchildren
title= itemname>
(item) => (
<Item key= itemname> itemname</Item>
)
</Section>
)
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
File Types
</ActionButton>
<Menu
items=[
{
name: 'Docs'
children: [
{name: 'PDF'}
]
}
{
name: 'Images'
children: [
{
name:
'jpeg'
}
{
name: 'png'
}
{
name:
'tiff'
}
]
}
]>
(item) => (
<Section
key= itemname
items=
itemchildren
title=
itemname
>
(item) => (
<Item
key=
itemname
>
itemname
</Item>
)
</Section>
)
</Menu>
</MenuTrigger>
Complex Menu Items#
A Menu Item's content may be any renderable node, not just strings.
import {Keyboard Text} from '@react-spectrum/text';
<MenuTrigger>
<ActionButton>
Edit
</ActionButton>
<Menu
items=[
{name: 'Copy' icon: 'Copy' shortcut: '⌘C'}
{name: 'Cut' icon: 'Cut' shortcut: '⌘X'}
{name: 'Paste' icon: 'Paste' shortcut: '⌘V'}
]>
item => {
let iconMap = {
Copy
Cut
Paste
};
let Icon = iconMap[itemicon];
return (
<Item key= itemname childItems= itemchildren textValue= itemname>
<Icon size="S" />
<Text> itemname</Text>
<Keyboard> itemshortcut</Keyboard>
</Item>
);
}
</Menu>
</MenuTrigger>
import {Keyboard Text} from '@react-spectrum/text';
<MenuTrigger>
<ActionButton>Edit</ActionButton>
<Menu
items=[
{name: 'Copy' icon: 'Copy' shortcut: '⌘C'}
{name: 'Cut' icon: 'Cut' shortcut: '⌘X'}
{name: 'Paste' icon: 'Paste' shortcut: '⌘V'}
]>
(item) => {
let iconMap = {
Copy
Cut
Paste
};
let Icon = iconMap[itemicon];
return (
<Item
key= itemname
childItems= itemchildren
textValue= itemname>
<Icon size="S" />
<Text> itemname</Text>
<Keyboard> itemshortcut</Keyboard>
</Item>
);
}
</Menu>
</MenuTrigger>
import {
Keyboard
Text
} from '@react-spectrum/text';
<MenuTrigger>
<ActionButton>
Edit
</ActionButton>
<Menu
items=[
{
name: 'Copy'
icon: 'Copy'
shortcut: '⌘C'
}
{
name: 'Cut'
icon: 'Cut'
shortcut: '⌘X'
}
{
name: 'Paste'
icon: 'Paste'
shortcut: '⌘V'
}
]>
(item) => {
let iconMap = {
Copy
Cut
Paste
};
let Icon =
iconMap[
itemicon
];
return (
<Item
key=
itemname
childItems=
itemchildren
textValue=
itemname
>
<Icon size="S" />
<Text>
itemname
</Text>
<Keyboard>
itemshortcut
</Keyboard>
</Item>
);
}
</Menu>
</MenuTrigger>
Internationalization#
To internationalize a Menu, a localized string should be passed to the children
prop of each Menu Item or to a Section's title
prop. For languages that are
read right-to-left (e.g. Hebrew and Arabic), the layout of the Menu is flipped.
Accessibility#
Title-less Menu Sections must be provided with an aria-label
for accessibility.
<MenuTrigger>
<ActionButton>Edit</ActionButton>
<Menu
items=[
{name: 'Rollback Options' children: [{name: 'Undo'} {name: 'Redo'}]}
{
name: 'Selected Text Options'
children: [{name: 'Cut'} {name: 'Copy'} {name: 'Paste'}]
}
]>
(item) => (
<Section key= itemname items= itemchildren aria-label= itemname>
(item) => <Item key= itemname> itemname</Item>
</Section>
)
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>Edit</ActionButton>
<Menu
items=[
{
name: 'Rollback Options'
children: [{name: 'Undo'} {name: 'Redo'}]
}
{
name: 'Selected Text Options'
children: [
{name: 'Cut'}
{name: 'Copy'}
{name: 'Paste'}
]
}
]>
(item) => (
<Section
key= itemname
items= itemchildren
aria-label= itemname>
(item) => (
<Item key= itemname> itemname</Item>
)
</Section>
)
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
Edit
</ActionButton>
<Menu
items=[
{
name:
'Rollback Options'
children: [
{
name:
'Undo'
}
{
name:
'Redo'
}
]
}
{
name:
'Selected Text Options'
children: [
{
name: 'Cut'
}
{
name:
'Copy'
}
{
name:
'Paste'
}
]
}
]>
(item) => (
<Section
key= itemname
items=
itemchildren
aria-label=
itemname
>
(item) => (
<Item
key=
itemname
>
itemname
</Item>
)
</Section>
)
</Menu>
</MenuTrigger>
Events#
Menu supports selection via mouse, keyboard, and touch.
onOpenChange#
MenuTrigger accepts an onOpenChange
handler which is triggered whenever the Menu is opened or closed.
The example below uses onOpenChange
to update a separate span element with the current open state of the Menu.
function Example() {
let [state setState] = ReactuseState(false);
return (
<div>
<MenuTrigger onOpenChange=(isOpen) => setState(isOpen)>
<ActionButton>Edit</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<span style={'margin-left': '8px'}>
Current open state: statetoString()
</span>
</div>
);
}
function Example() {
let [state setState] = ReactuseState(false);
return (
<div>
<MenuTrigger
onOpenChange=(isOpen) => setState(isOpen)>
<ActionButton>Edit</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<span style={'margin-left': '8px'}>
Current open state: statetoString()
</span>
</div>
);
}
function Example() {
let [
state
setState
] = ReactuseState(
false
);
return (
<div>
<MenuTrigger
onOpenChange=(
isOpen
) =>
setState(
isOpen
)
>
<ActionButton>
Edit
</ActionButton>
<Menu>
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Menu>
</MenuTrigger>
<span
style={
'margin-left':
'8px'
}>
Current open
state:' '
statetoString()
</span>
</div>
);
}
onAction#
Menu accepts an onAction
handler which is triggered whenever a Menu Item is selected.
The example below uses the onAction
to update text beside the MenuTrigger with the last selected Item.
function Example() {
let [state setState] = ReactuseState(false);
return (
<div>
<MenuTrigger>
<ActionButton>
Edit
</ActionButton>
<Menu onAction=(value) => setState(value)>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<span style={'margin-left': '8px'}>onAction: statetoString()</span>
</div>
);
}
function Example() {
let [state setState] = ReactuseState(false);
return (
<div>
<MenuTrigger>
<ActionButton>Edit</ActionButton>
<Menu onAction=(value) => setState(value)>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<span style={'margin-left': '8px'}>
onAction: statetoString()
</span>
</div>
);
}
function Example() {
let [
state
setState
] = ReactuseState(
false
);
return (
<div>
<MenuTrigger>
<ActionButton>
Edit
</ActionButton>
<Menu
onAction=(
value
) =>
setState(
value
)
>
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Menu>
</MenuTrigger>
<span
style={
'margin-left':
'8px'
}>
onAction:' '
statetoString()
</span>
</div>
);
}
Props#
MenuTrigger#
Name | Type | Default | Description |
children | ReactElement[] | — | The contents of the MenuTrigger, a trigger and a Menu. See the MenuTrigger Content section for more information on what to provide as children. |
align | Alignment | — | Where the Menu aligns with its trigger. |
direction | 'bottom' | 'top' | — | Where the Menu opens relative to its trigger. |
closeOnSelect | boolean | — | Whether the Menu closes when a selection is made. |
shouldFlip | boolean | — | Whether the element should flip its orientation when there is insufficient space for it to render within the view. |
isOpen | boolean | — | Whether the overlay is open by default (controlled). |
defaultOpen | boolean | — | Whether the overlay is open by default (uncontrolled). |
Events
Name | Type | Default | Description |
onOpenChange | (
(isOpen: boolean
)) => void | — | Handler that is called when the overlay's open state changes. |
Menu#
Name | Type | Default | Description |
children | CollectionChildren<T> | — | The contents of the collection. |
autoFocus | boolean | FocusStrategy | — | Where the focus should be set. |
shouldFocusWrap | boolean | — | Whether keyboard navigation is circular. |
items | Iterable<T> | — | Item objects in the collection. |
disabledKeys | Iterable<Key> | — | The item keys that are disabled. These items cannot be selected, focused, or otherwise interacted with. |
selectionMode | SelectionMode | — | The type of selection that is allowed in the collection. |
disallowEmptySelection | boolean | — | Whether the collection allows empty selection. |
selectedKeys | 'all' | Iterable<Key> | — | The currently selected keys in the collection (controlled). |
defaultSelectedKeys | 'all' | Iterable<Key> | — | The initial selected keys in the collection (uncontrolled). |
Events
Name | Type | Default | Description |
onAction | (
(key: Key
)) => void | — | Handler that is called when an item is selected. |
onSelectionChange | (
(keys: Selection
)) => any | — | Handler that is called when the selection changes. |
Layout
Name | Type | Default | Description |
flex | string
| number
| boolean | — | When used in a flex layout, specifies how the element will grow or shrink to fit the space available. See MDN. |
flexGrow | number | — | When used in a flex layout, specifies how the element will grow to fit the space available. See MDN. |
flexShrink | number | — | When used in a flex layout, specifies how the element will shrink to fit the space available. See MDN. |
flexBasis | number | string | — | When used in a flex layout, specifies the initial main size of the element. See MDN. |
alignSelf | 'auto'
| 'normal'
| 'start'
| 'end'
| 'center'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'stretch' | — | Overrides the alignItems property of a flex or grid container. See MDN. |
justifySelf | 'auto'
| 'normal'
| 'start'
| 'end'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'center'
| 'left'
| 'right'
| 'stretch' | — | Specifies how the element is justified inside a flex or grid container. See MDN. |
order | number | — | The layout order for the element within a flex or grid container. See MDN. |
gridArea | string | — | When used in a grid layout, specifies the named grid area that the element should be placed in within the grid. See MDN. |
gridColumn | string | — | When used in a grid layout, specifies the column the element should be placed in within the grid. See MDN. |
gridRow | string | — | When used in a grid layout, specifies the row the element should be placed in within the grid. See MDN. |
gridColumnStart | string | — | When used in a grid layout, specifies the starting column to span within the grid. See MDN. |
gridColumnEnd | string | — | When used in a grid layout, specifies the ending column to span within the grid. See MDN. |
gridRowStart | string | — | When used in a grid layout, specifies the starting row to span within the grid. See MDN. |
gridRowEnd | string | — | When used in a grid layout, specifies the ending row to span within the grid. See MDN. |
Spacing
Name | Type | Default | Description |
margin | DimensionValue | — | The margin for all four sides of the element. See MDN. |
marginTop | DimensionValue | — | The margin for the top side of the element. See MDN. |
marginBottom | DimensionValue | — | The margin for the bottom side of the element. See MDN. |
marginStart | DimensionValue | — | The margin for the logical start side of the element, depending on layout direction. See MDN. |
marginEnd | DimensionValue | — | The margin for the logical end side of an element, depending on layout direction. See MDN. |
marginX | DimensionValue | — | The margin for both the left and right sides of the element. See MDN. |
marginY | DimensionValue | — | The margin for both the top and bottom sides of the element. See MDN. |
Sizing
Name | Type | Default | Description |
width | DimensionValue | — | The width of the element. See MDN. |
minWidth | DimensionValue | — | The minimum width of the element. See MDN. |
maxWidth | DimensionValue | — | The maximum width of the element. See MDN. |
height | DimensionValue | — | The height of the element. See MDN. |
minHeight | DimensionValue | — | The minimum height of the element. See MDN. |
maxHeight | DimensionValue | — | The maximum height of the element. See MDN. |
Positioning
Name | Type | Default | Description |
position | 'static'
| 'relative'
| 'absolute'
| 'fixed'
| 'sticky' | — | Specifies how the element is positioned. See MDN. |
top | DimensionValue | — | The top position for the element. See MDN. |
bottom | DimensionValue | — | The bottom position for the element. See MDN. |
left | DimensionValue | — | The left position for the element. See MDN. Consider using start instead for RTL support. |
right | DimensionValue | — | The right position for the element. See MDN. Consider using start instead for RTL support. |
start | DimensionValue | — | The logical start position for the element, depending on layout direction. See MDN. |
end | DimensionValue | — | The logical end position for the element, depending on layout direction. See MDN. |
zIndex | number | — | The stacking order for the element. See MDN. |
isHidden | boolean | — | Hides the element. |
Accessibility
Name | Type | Default | Description |
id | string | — | The element's unique identifier. |
aria-label | string | — | Defines a string value that labels the current element. |
aria-labelledby | string | — | Identifies the element (or elements) that labels the current element. |
aria-describedby | string | — | Identifies the element (or elements) that describes the object. |
aria-details | string | — | Identifies the element (or elements) that provide a detailed, extended description for the object. |
Advanced
Name | Type | Default | Description |
UNSAFE_className | string | — | Sets the CSS className for the element. Only use as a last resort. Use style props instead. |
UNSAFE_style | CSSProperties | — | Sets inline style for the element. Only use as a last resort. Use style props instead. |
Behavioral Options#
Align (MenuTrigger)#
<MenuTrigger align="start">
<ActionButton>
placement align=start
</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger align="end">
<ActionButton>
placement align=end
</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger align="start">
<ActionButton>
placement align=start
</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger align="end">
<ActionButton>
placement align=end
</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger align="start">
<ActionButton>
placement
align=start
</ActionButton>
<Menu>
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Menu>
</MenuTrigger>
<MenuTrigger align="end">
<ActionButton>
placement align=end
</ActionButton>
<Menu>
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Menu>
</MenuTrigger>
Direction (MenuTrigger)#
<MenuTrigger direction="bottom" shouldFlip=false>
<ActionButton>
placement direction=bottom
</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger direction="top" shouldFlip=false>
<ActionButton>
placement direction=top
</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger direction="bottom" shouldFlip=false>
<ActionButton>
placement direction=bottom
</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger direction="top" shouldFlip=false>
<ActionButton>
placement direction=top
</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger
direction="bottom"
shouldFlip=false>
<ActionButton>
placement
direction=bottom
</ActionButton>
<Menu>
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Menu>
</MenuTrigger>
<MenuTrigger
direction="top"
shouldFlip=false>
<ActionButton>
placement
direction=top
</ActionButton>
<Menu>
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Menu>
</MenuTrigger>
Autofocus (Menu)#
Applying autoFocus
to the Menu of the MenuTrigger sets focus to a Menu Item
within the Menu upon opening.
This example demonstrates how to use autoFocus
to automatically focus the
selected Menu Item when the Menu is opened.
<MenuTrigger>
<ActionButton>
autoFocus
</ActionButton>
<Menu
selectionMode="single"
selectedKeys=['copy']
autoFocus>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
autoFocus
</ActionButton>
<Menu
selectionMode="single"
selectedKeys=['copy']
autoFocus>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
autoFocus
</ActionButton>
<Menu
selectionMode="single"
selectedKeys=[
'copy'
]
autoFocus>
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Menu>
</MenuTrigger>
These examples demonstrate how to use autoFocus
to set whether or not the
first Menu Item or last Menu Item is focused when the Menu is opened.
<MenuTrigger>
<ActionButton>
autofocus=first
</ActionButton>
<Menu autoFocus="first">
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
autofocus=last
</ActionButton>
<Menu autoFocus="last">
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
autofocus=first
</ActionButton>
<Menu autoFocus="first">
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
autofocus=last
</ActionButton>
<Menu autoFocus="last">
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
autofocus=first
</ActionButton>
<Menu autoFocus="first">
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
autofocus=last
</ActionButton>
<Menu autoFocus="last">
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Menu>
</MenuTrigger>
Closes on Selection (MenuTrigger)#
The closeOnSelect
MenuTrigger prop closes the Menu when an MenuItem is
selected (default). Setting the closeOnSelect
prop to false
would be useful
for a Menu listing filtering options where the user would make multiple
selections at once.
<MenuTrigger closeOnSelect>
<ActionButton>
closeOnSelect=true
</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect=false>
<ActionButton>
closeOnSelect=false
</ActionButton>
<Menu selectionMode="multiple">
<Item key="jpg">jpg</Item>
<Item key="png">png</Item>
<Item key="tiff">tiff</Item>
</Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect>
<ActionButton>
closeOnSelect=true
</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect=false>
<ActionButton>
closeOnSelect=false
</ActionButton>
<Menu selectionMode="multiple">
<Item key="jpg">jpg</Item>
<Item key="png">png</Item>
<Item key="tiff">tiff</Item>
</Menu>
</MenuTrigger>
<MenuTrigger
closeOnSelect>
<ActionButton>
closeOnSelect=true
</ActionButton>
<Menu>
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Menu>
</MenuTrigger>
<MenuTrigger
closeOnSelect=
false
>
<ActionButton>
closeOnSelect=false
</ActionButton>
<Menu selectionMode="multiple">
<Item key="jpg">
jpg
</Item>
<Item key="png">
png
</Item>
<Item key="tiff">
tiff
</Item>
</Menu>
</MenuTrigger>
Disabled Menu Items (Menu)#
<MenuTrigger>
<ActionButton>
Filter
</ActionButton>
<Menu
items=[
{name: 'tiff' dataId: 'a1b2c3'}
{name: 'png' dataId: 'g5h1j9'}
{name: 'jpg' dataId: 'p8k3i4'}
{name: 'PDF' dataId: 'j7i3a0'}
]
disabledKeys=['a1b2c3' 'p8k3i4']>
item => <Item key= itemdataId> itemname</Item>
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
Filter
</ActionButton>
<Menu
items=[
{name: 'tiff' dataId: 'a1b2c3'}
{name: 'png' dataId: 'g5h1j9'}
{name: 'jpg' dataId: 'p8k3i4'}
{name: 'PDF' dataId: 'j7i3a0'}
]
disabledKeys=['a1b2c3' 'p8k3i4']>
item => <Item key= itemdataId> itemname</Item>
</Menu>
</MenuTrigger>
<MenuTrigger>
<ActionButton>
Filter
</ActionButton>
<Menu
items=[
{
name: 'tiff'
dataId:
'a1b2c3'
}
{
name: 'png'
dataId:
'g5h1j9'
}
{
name: 'jpg'
dataId:
'p8k3i4'
}
{
name: 'PDF'
dataId:
'j7i3a0'
}
]
disabledKeys=[
'a1b2c3'
'p8k3i4'
]>
(item) => (
<Item
key=
itemdataId
>
itemname
</Item>
)
</Menu>
</MenuTrigger>
Flipping (MenuTrigger)#
Applying shouldFlip
to the MenuTrigger makes the Menu attempt to flip on its
main axis in situations where the original placement would cause it to render out of view.
<MenuTrigger shouldFlip>
<ActionButton>
shouldFlip=true
</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger shouldFlip=false>
<ActionButton>
shouldFlip=false
</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger shouldFlip>
<ActionButton>
shouldFlip=true
</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger shouldFlip=false>
<ActionButton>
shouldFlip=false
</ActionButton>
<Menu>
<Item key="cut">Cut</Item>
<Item key="copy">Copy</Item>
<Item key="paste">Paste</Item>
</Menu>
</MenuTrigger>
<MenuTrigger
shouldFlip>
<ActionButton>
shouldFlip=true
</ActionButton>
<Menu>
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Menu>
</MenuTrigger>
<MenuTrigger
shouldFlip=false>
<ActionButton>
shouldFlip=false
</ActionButton>
<Menu>
<Item key="cut">
Cut
</Item>
<Item key="copy">
Copy
</Item>
<Item key="paste">
Paste
</Item>
</Menu>
</MenuTrigger>
Open (MenuTrigger)#
The isOpen
and defaultOpen
props control whether the MenuTrigger is open by default.
They apply controlled and uncontrolled behavior on the MenuTrigger respectively.