显示一个位于指针位置的菜单,由右键单击或长按触发。
import * as React from "react";import { ContextMenu } from "radix-ui";import { DotFilledIcon, CheckIcon, ChevronRightIcon, } from "@radix-ui/react-icons";import "./styles.css";const ContextMenuDemo = () => {const [bookmarksChecked, setBookmarksChecked] = React.useState(true);const [urlsChecked, setUrlsChecked] = React.useState(false);const [person, setPerson] = React.useState("pedro");return (<ContextMenu.Root><ContextMenu.Trigger className="ContextMenuTrigger">Right-click here.</ContextMenu.Trigger><ContextMenu.Portal><ContextMenu.Content className="ContextMenuContent" sideOffset={5} align="end" ><ContextMenu.Item className="ContextMenuItem">Back <div className="RightSlot">⌘+[</div></ContextMenu.Item><ContextMenu.Item className="ContextMenuItem" disabled>Forward <div className="RightSlot">⌘+]</div></ContextMenu.Item><ContextMenu.Item className="ContextMenuItem">Reload <div className="RightSlot">⌘+R</div></ContextMenu.Item><ContextMenu.Sub><ContextMenu.SubTrigger className="ContextMenuSubTrigger">More Tools<div className="RightSlot"><ChevronRightIcon /></div></ContextMenu.SubTrigger><ContextMenu.Portal><ContextMenu.SubContent className="ContextMenuSubContent" sideOffset={2} alignOffset={-5} ><ContextMenu.Item className="ContextMenuItem">Save Page As… <div className="RightSlot">⌘+S</div></ContextMenu.Item><ContextMenu.Item className="ContextMenuItem">Create Shortcut…</ContextMenu.Item><ContextMenu.Item className="ContextMenuItem">Name Window…</ContextMenu.Item><ContextMenu.Separator className="ContextMenuSeparator" /><ContextMenu.Item className="ContextMenuItem">Developer Tools</ContextMenu.Item></ContextMenu.SubContent></ContextMenu.Portal></ContextMenu.Sub><ContextMenu.Separator className="ContextMenuSeparator" /><ContextMenu.CheckboxItem className="ContextMenuCheckboxItem" checked={bookmarksChecked} onCheckedChange={setBookmarksChecked} ><ContextMenu.ItemIndicator className="ContextMenuItemIndicator"><CheckIcon /></ContextMenu.ItemIndicator>Show Bookmarks <div className="RightSlot">⌘+B</div></ContextMenu.CheckboxItem><ContextMenu.CheckboxItem className="ContextMenuCheckboxItem" checked={urlsChecked} onCheckedChange={setUrlsChecked} ><ContextMenu.ItemIndicator className="ContextMenuItemIndicator"><CheckIcon /></ContextMenu.ItemIndicator>Show Full URLs</ContextMenu.CheckboxItem><ContextMenu.Separator className="ContextMenuSeparator" /><ContextMenu.Label className="ContextMenuLabel">People</ContextMenu.Label><ContextMenu.RadioGroup value={person} onValueChange={setPerson}><ContextMenu.RadioItem className="ContextMenuRadioItem" value="pedro" ><ContextMenu.ItemIndicator className="ContextMenuItemIndicator"><DotFilledIcon /></ContextMenu.ItemIndicator>Pedro Duarte</ContextMenu.RadioItem><ContextMenu.RadioItem className="ContextMenuRadioItem" value="colm" ><ContextMenu.ItemIndicator className="ContextMenuItemIndicator"><DotFilledIcon /></ContextMenu.ItemIndicator>Colm Tuite</ContextMenu.RadioItem></ContextMenu.RadioGroup></ContextMenu.Content></ContextMenu.Portal></ContextMenu.Root>);};export default ContextMenuDemo;
支持可配置阅读方向的子菜单。
支持项目、标签和项目组。
支持可选的不确定状态的可检查项目(单个或多个)。
支持模态和非模态模式。
自定义侧边、对齐方式、偏移量和碰撞处理。
焦点完全管理。
全键盘导航。
支持类型预判。
取消和分层行为高度可定制。
在触摸设备上通过长按触发
从命令行安装组件。
导入所有部件并将它们组合在一起。
遵循 菜单 WAI-ARIA 设计模式 并使用 游走的 tabindex 来管理菜单项之间的焦点移动。
包含上下文菜单的所有部分。
打开上下文菜单的区域。在右键单击(或使用相关的键盘快捷键)时,将其包裹在您希望上下文菜单打开的目标周围。
使用时,将内容部分门户到 body
中。
在打开的上下文菜单中弹出的组件。
可选的箭头元素,用于在子菜单旁边渲染。它可以用于帮助在视觉上将触发项目与 ContextMenu.Content
连接。必须在 ContextMenu.Content
内部渲染。
包含上下文菜单项的组件。
用于将多个 ContextMenu.Item
分组。
用于渲染标签。它不能使用箭头键获得焦点。
可以像复选框一样控制和渲染的项目。
用于将多个 ContextMenu.RadioItem
分组。
可以像单选框一样控制和渲染的项目。
当父级 ContextMenu.CheckboxItem
或 ContextMenu.RadioItem
被选中时渲染。您可以直接为此元素设置样式,或者将其用作放置图标的包装器,或者两者兼有。
用于在上下文菜单中视觉上分隔项目。
包含子菜单的所有部分。
打开子菜单的项目。必须在 ContextMenu.Sub
内部渲染。
当子菜单打开时弹出的组件。必须在 ContextMenu.Sub
内部渲染。
您可以通过结合使用 ContextMenu.Sub
和其部分来创建子菜单。
您可以通过 data-disabled
属性为禁用项目添加特殊样式。
使用 Separator
部分在项目之间添加分隔符。
使用 Label
部分帮助标记一个部分。
使用 CheckboxItem
部分添加一个可被选中的项目。
使用 RadioGroup
和 RadioItem
部分添加一个可以在其他项目中选中的项目。
您可以在 Item
部分中添加额外的装饰元素,例如图像。
您可能希望限制内容(或子内容)的宽度,以使其匹配触发器(或子触发器)的宽度。您也可以希望限制其高度,以不超过视口。
我们暴露了几个 CSS 自定义属性,例如 --radix-context-menu-trigger-width
和 --radix-context-menu-content-available-height
来支持这一点。使用它们来限制内容大小。
我们暴露了一个 CSS 自定义属性 --radix-context-menu-content-transform-origin
。使用它根据 side
、sideOffset
、align
、alignOffset
和任何碰撞从其计算的原点动画内容。
我们暴露了 data-side
和 data-align
属性。它们的值在运行时将变化以反映碰撞。使用它们来创建基于碰撞和方向的动画。
使用 游走的 tabindex 来管理菜单项之间的焦点移动。