通过按钮触发,向用户显示一个菜单,例如一组操作或功能。
import React from 'react';import * as DropdownMenu from '@radix-ui/react-dropdown-menu';import { HamburgerMenuIcon, DotFilledIcon, CheckIcon, ChevronRightIcon, } from '@radix-ui/react-icons';import './styles.css';const DropdownMenuDemo = () => {const [bookmarksChecked, setBookmarksChecked] = React.useState(true);const [urlsChecked, setUrlsChecked] = React.useState(false);const [person, setPerson] = React.useState('pedro');return (<DropdownMenu.Root><DropdownMenu.Trigger asChild><button className="IconButton" aria-label="Customise options"><HamburgerMenuIcon /></button></DropdownMenu.Trigger><DropdownMenu.Portal><DropdownMenu.Content className="DropdownMenuContent" sideOffset={5}><DropdownMenu.Item className="DropdownMenuItem">New Tab <div className="RightSlot">⌘+T</div></DropdownMenu.Item><DropdownMenu.Item className="DropdownMenuItem">New Window <div className="RightSlot">⌘+N</div></DropdownMenu.Item><DropdownMenu.Item className="DropdownMenuItem" disabled>New Private Window <div className="RightSlot">⇧+⌘+N</div></DropdownMenu.Item><DropdownMenu.Sub><DropdownMenu.SubTrigger className="DropdownMenuSubTrigger">More Tools<div className="RightSlot"><ChevronRightIcon /></div></DropdownMenu.SubTrigger><DropdownMenu.Portal><DropdownMenu.SubContent className="DropdownMenuSubContent" sideOffset={2} alignOffset={-5} ><DropdownMenu.Item className="DropdownMenuItem">Save Page As… <div className="RightSlot">⌘+S</div></DropdownMenu.Item><DropdownMenu.Item className="DropdownMenuItem">Create Shortcut…</DropdownMenu.Item><DropdownMenu.Item className="DropdownMenuItem">Name Window…</DropdownMenu.Item><DropdownMenu.Separator className="DropdownMenu.Separator" /><DropdownMenu.Item className="DropdownMenuItem">Developer Tools</DropdownMenu.Item></DropdownMenu.SubContent></DropdownMenu.Portal></DropdownMenu.Sub><DropdownMenu.Separator className="DropdownMenuSeparator" /><DropdownMenu.CheckboxItem className="DropdownMenuCheckboxItem" checked={bookmarksChecked} onCheckedChange={setBookmarksChecked} ><DropdownMenu.ItemIndicator className="DropdownMenuItemIndicator"><CheckIcon /></DropdownMenu.ItemIndicator>Show Bookmarks <div className="RightSlot">⌘+B</div></DropdownMenu.CheckboxItem><DropdownMenu.CheckboxItem className="DropdownMenuCheckboxItem" checked={urlsChecked} onCheckedChange={setUrlsChecked} ><DropdownMenu.ItemIndicator className="DropdownMenuItemIndicator"><CheckIcon /></DropdownMenu.ItemIndicator>Show Full URLs</DropdownMenu.CheckboxItem><DropdownMenu.Separator className="DropdownMenuSeparator" /><DropdownMenu.Label className="DropdownMenuLabel">People</DropdownMenu.Label><DropdownMenu.RadioGroup value={person} onValueChange={setPerson}><DropdownMenu.RadioItem className="DropdownMenuRadioItem" value="pedro"><DropdownMenu.ItemIndicator className="DropdownMenuItemIndicator"><DotFilledIcon /></DropdownMenu.ItemIndicator>Pedro Duarte</DropdownMenu.RadioItem><DropdownMenu.RadioItem className="DropdownMenuRadioItem" value="colm"><DropdownMenu.ItemIndicator className="DropdownMenuItemIndicator"><DotFilledIcon /></DropdownMenu.ItemIndicator>Colm Tuite</DropdownMenu.RadioItem></DropdownMenu.RadioGroup><DropdownMenu.Arrow className="DropdownMenuArrow" /></DropdownMenu.Content></DropdownMenu.Portal></DropdownMenu.Root>);};export default DropdownMenuDemo;
可以是受控或非受控的。
支持子菜单,并可配置阅读方向。
支持项目、标签和项目组。
支持可选中项目(单个或多个),并可选地使用不确定状态。
支持模态和非模态模式。
自定义侧面、对齐方式、偏移量和碰撞处理。
可以选择渲染指向箭头。
完全管理焦点。
完整的键盘导航。
支持类型提示。
关闭和分层行为高度可定制。
从命令行安装组件。
导入所有部分并将它们组合在一起。
包含下拉菜单的所有部分。
切换下拉菜单的按钮。默认情况下,DropdownMenu.Content
将相对于触发器进行定位。
使用时,将内容部分传送到 body
中。
下拉菜单打开时弹出的组件。
一个可选的箭头元素,用于与下拉菜单一起渲染。这可以用来帮助视觉上将触发器与 DropdownMenu.Content
关联起来。必须在 DropdownMenu.Content
中渲染。
包含下拉菜单项目的组件。
用于对多个 DropdownMenu.Item
进行分组。
用于渲染标签。它不能使用箭头键聚焦。
一个可以像复选框一样控制和渲染的项目。
用于对多个 DropdownMenu.RadioItem
进行分组。
一个可以像单选按钮一样控制和渲染的项目。
当父级 DropdownMenu.CheckboxItem
或 DropdownMenu.RadioItem
被选中时渲染。您可以直接对该元素进行样式设置,也可以将其用作包装器来放入图标,或者两者兼而有之。
用于在下拉菜单中视觉上分隔项目。
包含子菜单的所有部分。
打开子菜单的项目。必须在 DropdownMenu.Sub
中渲染。
子菜单打开时弹出的组件。必须在 DropdownMenu.Sub
中渲染。
您可以通过组合使用 DropdownMenu.Sub
及其各部分来创建子菜单。
您可以通过 data-disabled
属性为禁用项目添加特殊样式。
使用 Separator
部分在项目之间添加分隔符。
使用 Label
部分来帮助标记某个区域。
使用 CheckboxItem
部分添加一个可以勾选的项目。
使用 RadioGroup
和 RadioItem
部分添加一个可以勾选的项目,该项目可以与其他项目互斥。
您可以在 Item
部分添加额外的装饰元素,例如图像。
您可能希望约束内容(或子菜单内容)的宽度,使其与触发器(或子菜单触发器)宽度一致。您可能还希望约束其高度,使其不超过视窗。
我们公开了几个 CSS 自定义属性,例如 --radix-dropdown-menu-trigger-width
和 --radix-dropdown-menu-content-available-height
来支持这一点。使用它们来约束内容的尺寸。
我们公开了一个 CSS 自定义属性 --radix-dropdown-menu-content-transform-origin
。使用它根据 side
、sideOffset
、align
、alignOffset
和任何冲突来从其计算的原点为内容设置动画。
我们公开了 data-side
和 data-align
属性。它们的值将在运行时发生变化以反映冲突。使用它们来创建碰撞和方向感知动画。
遵循 菜单按钮 WAI-ARIA 设计模式 并使用 循环 tabindex 来管理菜单项之间的焦点移动。
通过将原始部分抽象到您自己的组件中来创建您自己的 API。
此示例抽象了 DropdownMenu.Arrow
和 DropdownMenu.ItemIndicator
部分。它还包装了 CheckboxItem
和 RadioItem
的实现细节。