组件/ContextMenu 右键菜单

ContextMenu 右键菜单

在指针或指定坐标处打开的命令菜单

已验证自 0.3.4

用法

基础

右键触发区域打开菜单;trigger="manual" 配合 v-model、x、y 在指定坐标打开。

示例加载中...

锚点模式

anchorMode="pointer"(默认)跟随指针或传入坐标;reference 像 Dropdown 一样贴齐触发区域。

<TxContextMenu anchor-mode="pointer" />
<TxContextMenu anchor-mode="reference" />

子菜单

TxContextMenuSubmenu 嵌套任意层级的子面板,悬停触发行即展开。

示例加载中...

最佳实践

  • 编辑器快捷键、命令面板、画布节点等非右键场景用 trigger="manual",并显式传入 x / y。
  • 标准右键菜单保持 anchorMode="pointer";只在需要贴齐整个触发元素时用 reference。
  • 嵌套菜单用 TxContextMenuSubmenu;手动把 TxContextMenuPanel Teleport 出去时,在子面板上设 outsideGuard。
  • closeOnSelect=false 只用于子菜单触发行或多步操作;普通命令选中后关闭。
  • 破坏性操作用 danger;color 只用设计系统已有的语义色。

API 参考

TxContextMenu

属性

属性名类型默认值说明
modelValueboolean | undefinedundefined打开状态(v-model);undefined 时非受控。
xnumber0受控或手动打开时的横坐标。
ynumber0受控或手动打开时的纵坐标。
widthnumber220菜单宽度;0 为自动宽度。
minWidthnumber0最小宽度。
maxWidthnumber360最大宽度;0 不限制。
maxHeightnumber420最大高度,并随可用视口高度收缩。
unlimitedHeightbooleanfalse不限制高度。
disabledbooleanfalse禁止触发与打开。
eagerbooleanfalse首次打开前就挂载菜单内容。
trigger'contextmenu' | 'click' | 'both' | 'manual''contextmenu'触发方式;manual 只由外部状态与坐标打开。
anchorMode'pointer' | 'reference''pointer'pointer 跟随指针或传入坐标,reference 跟随触发区域。
preventDefaultbooleantrue右键时阻止浏览器原生菜单。
placementBaseAnchorPlacement'bottom-start'相对坐标点的初始方向。
offsetnumber2与坐标点的距离。
closeOnEscbooleantrue按 Esc 关闭。
closeOnClickOutsidebooleantrue点击菜单外部关闭。
closeOnTriggerPointerDownbooleantrue打开后点击触发区域关闭;click / both 模式下忽略。
closeOnAnyPointerDownbooleanfalse在菜单以外任何位置按下都关闭,含触发区域。
closeOnSelectbooleantrue选中条目后关闭。
activationFeedbackbooleantrue关闭前先清空、再确认高亮,各 90ms;减少动态效果时跳过。
showArrowbooleanfalse显示指向坐标点的箭头。
arrowSizenumber10箭头尺寸。
animationBaseAnchorAnimationOptions{}开合动画:transfer、boom、opacity 或 none。
keepAliveContentbooleantrue关闭后保留内容状态。
panelVariant'solid' | 'dashed' | 'plain''solid'面板边框样式。
panelBackground'pure' | 'mask' | 'blur' | 'glass' | 'refraction''refraction'面板背景效果。
panelShadow'none' | 'soft' | 'medium''medium'面板阴影。
panelRadiusnumber14面板圆角。
panelPaddingnumber6面板内边距。
panelCardBaseAnchorPanelCardProps-透传给内部 TxCard 的视觉参数。

事件

事件名参数说明
update:modelValueboolean打开状态变化时触发。
open{ x: number; y: number }打开时触发,参数为最终坐标。
close-关闭时触发。

插槽

插槽名参数说明
trigger-触发元素;未提供时使用默认插槽。
default-没有 trigger 插槽时的触发内容。
menu-菜单内容,渲染在内部 TxContextMenuPanel 中。

暴露方法

名称类型说明
openAt(target?: { x: number; y: number } | MouseEvent | PointerEvent) => void在坐标或事件位置打开。
openFromEvent(event: MouseEvent | PointerEvent) => void从鼠标或指针事件打开。
close() => void关闭菜单。
updatePosition() => void重新计算 Floating UI 定位。

TxContextMenuPanel

属性

属性名类型默认值说明
widthnumber | string-面板宽度。
minWidthnumber | string-最小宽度。
maxWidthnumber | string-最大宽度。
maxHeightnumber | string-最大高度。
closeOnSelectbooleantrue子项选中后是否关闭。
activationFeedbackbooleantrue子项的关闭前确认反馈,可逐项覆盖。
close() => void-关闭回调,注入给子项。
densebooleanfalse收紧条目间距。
outsideGuardbooleanfalse标记为菜单层,在其中点击不算外部点击。
role'menu' | 'listbox' | 'none''menu'ARIA role;menu / listbox 启用键盘导航,none 关闭。
ariaLabelstring-面板的无障碍名称。

插槽

插槽名参数说明
default-菜单项、分隔符或嵌套浮层。

暴露方法

名称类型说明
focusFirstItem() => void聚焦首个可用项;单独使用面板时需在打开后调用。

TxContextMenuItem

属性

属性名类型默认值说明
disabledbooleanfalse禁止选中。
dangerbooleanfalse危险操作样式。
colorstring-文字颜色,支持 CSS 变量。
shortcutstring-右侧的快捷键提示。
submenubooleanfalse显示子菜单箭头。
closeOnSelectboolean-覆盖父级 closeOnSelect。
activationFeedbackboolean-覆盖父级确认反馈;未设置时跟随最近的 TxContextMenuPanel。

事件

事件名参数说明
select-选中时触发;带确认反馈的关闭项在 180ms 确认后触发。

插槽

插槽名参数说明
default-主标签。
avatar-左侧图标或头像。
description-次级说明。
right-替换快捷键与子菜单箭头区域。

TxContextMenuSubmenu

属性

属性名类型默认值说明
disabledbooleanfalse禁用触发行,子面板不再展开。
placementBaseAnchorPlacement'right-start'子面板相对触发行的位置。
offsetnumber4触发行与子面板的距离。
widthnumber0子面板固定宽度;0 按内容与 minWidth 自适应。
minWidthnumber160子面板最小宽度。
maxHeightnumber420子面板最大高度。
unlimitedHeightbooleanfalse不限制子面板高度。
animationBaseAnchorAnimationOptions{}子面板动画。
panelCardBaseAnchorPanelCardProps-透传给子面板卡片的参数。
panelVariant'solid' | 'dashed' | 'plain''solid'子面板边框样式。
panelBackground'pure' | 'mask' | 'blur' | 'glass' | 'refraction''refraction'子面板背景效果。
panelShadow'none' | 'soft' | 'medium''medium'子面板阴影。
panelRadiusnumber14子面板圆角。
panelPaddingnumber6子面板内边距。

插槽

插槽名参数说明
default-触发行标签。
right-触发行右侧信息,位于箭头之前。
menu-子面板内容,可再嵌套 TxContextMenuSubmenu。

TxContextMenuDivider

属性

属性名类型默认值说明
dashedbooleanfalse虚线分隔符。
insetbooleanfalse左侧缩进,与带图标的条目对齐。

概述

  • 定位走 TxBaseAnchor(Floating UI flip + shift + size),靠近视口边缘时翻转、平移并收缩高度。
  • pointer 模式下,在同一触发区域重复右键,锚点移到最新位置。
  • 默认 Esc、外部点击与选中都会关闭;关闭前先清空高亮、再以 TxCardItem 激活态确认,然后派发 select。不关闭的条目立即派发。
  • 子菜单沿用根菜单的 closeOnSelect 与 activationFeedback,选中子项关闭整条链;点击子面板不算外部点击。
  • 悬停桥覆盖父子面板间隙;斜向经过的兄弟行不展开,停留约 100ms 才切换。
  • 键盘:方向键与 Home / End 在面板内移动,只识别 role="menuitem"(menu)或 role="option"(listbox)的子项;子菜单可用键盘展开与收回。

技术实现

  • 确认反馈由 packages/tuffex/packages/utils/menu-activation-feedback.ts 驱动,与 DropdownMenu 共用。
  • 源码:packages/tuffex/packages/components/src/context-menu/。
查看源码
packages/tuffex/packages/components/src/context-menu/index.ts