显示一个位于指针位置的菜单,通过右键单击或长按触发。
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;
支持带有可配置阅读方向的子菜单。
支持项目、标签、项目组。
支持可勾选的项目(单选或多选),并可选择不确定状态。
支持模态和非模态模式。
自定义侧边、对齐方式、偏移量、碰撞处理。
焦点完全受控。
完整的键盘导航。
Typeahead 支持。
关闭和分层行为高度可定制。
在触摸设备上通过长按触发
从命令行安装组件。
导入所有部件并将它们组装在一起。
遵循 Menu WAI-ARIA 设计模式 并使用 roving 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
属性。 它们的值将在运行时更改以反映碰撞。 使用它们来创建感知碰撞和方向的动画。
使用 roving tabindex 来管理菜单项之间的焦点移动。