更多菜单
Props
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
items | MoreMenuOption[] | - | 菜单内容:动作(MoreMenuItem)、分隔线({ type: 'divider' })和分组({ type: 'section', title, items })。必填。 |
label | string | 'More options' | 触发按钮的无障碍名称,同时也是菜单本身的名字和悬停时的提示文字。 |
variant | ButtonVariant | 'ghost' | 触发按钮的视觉变体:primary、secondary、ghost、destructive。 |
size | ButtonSize | 'md' | 触发按钮的尺寸:sm、md、lg。菜单里每一行的密度跟随这个值。 |
isDisabled | boolean | false | 是否禁用触发按钮。禁用后按钮变暗、宣告为禁用状态,点击与键盘都不再打开菜单。 |
placement | 'above' | 'below' | 'start' | 'end' | 'below' | 浮层相对触发器的位置。方向是逻辑的:start 与 end 依据菜单自身的书写方向解析,RTL 下自动镜像。空间不足时翻到相反方向。 |
alignment | 'start' | 'center' | 'end' | 'start' | 沿放置轴的对齐方式。溢出菜单通常用 end,让菜单与触发器的尾部边缘对齐。 |
presentation | 'popover' | 'bottom-sheet' | 'adaptive' | 'popover' | 动作的呈现形态。popover 是锚定在触发器旁的浮层;bottom-sheet 是底部的模态面板;adaptive 在主指针为粗略指针且宽度不超过 768px 时使用底部面板,其余情况使用浮层。 |
isMenuOpen | boolean | - | 受控的打开状态,配合 v-model:isMenuOpen 使用。不传时由组件自己管理状态。 |
isInline | boolean | false | 把菜单表面就地渲染,而不是移动到文档顶部。表面于是按普通文档流排布、不做视口定位。用于文档预览,以及不允许浮层脱离容器的场景。 |
MoreMenuItem
items 里的动作项可以带以下字段:
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
label | string | - | 这一行的主要文字。必填。 |
id | string | - | 行在该层级内的稳定标识。不传时按位置匹配;当 items 会重排、过滤或增长时传入,行才能在数组变化时保住自己的 DOM 节点与键盘焦点。 |
icon | string | Component | - | 显示在文字之前的图标:一个 CSS 图标类(例如 UnoCSS 的 i-carbon-copy,也可以是你自己的类名),或一个绘制 SVG 的组件。astryx-vue 不自带图标。 |
description | string | - | 文字下方的一行说明,用来区分相近的动作。 |
isDisabled | boolean | false | 这一行是否不可用。禁用行变暗、宣告为禁用,并被方向键与输入跳转跳过。 |
variant | 'default' | 'destructive' | 'default' | destructive 用错误色绘制文字、说明与图标,用于删除这类危险操作。 |
href | string | - | 这一行跳转的地址。给出后该行是一个真正的链接,因此带修饰键的点击和中键点击保持浏览器原本的含义(例如新标签页打开)。 |
target | '_blank' | '_self' | - | 链接的打开位置,仅在给出 href 时使用。 |
rel | string | - | 链接关系。当 target 为 _blank 时会自动补上 noopener noreferrer。 |
endContent | string | - | 行尾的附加内容,例如快捷键提示。 |
hasCloseOnSelect | boolean | true | 激活这一行后是否关闭菜单。把结果报告在行自身上的操作(例如复制后变成“已复制”)可以设为 false。 |
items | MoreMenuOption[] | - | 子菜单。给出后这一行变成子菜单入口:指针布局上向侧边展开,底部面板里换成该子菜单自己的视图。 |
onClick | (event: MouseEvent) => void | - | 这一行的动作。链接行会在浏览器跳转之前执行;带修饰键的点击交给浏览器,因此不会执行。 |
事件
| 名称 | 参数 | 说明 |
|---|---|---|
openChange | (isOpen: boolean) => void | 请求打开或关闭时触发。非受控用法下它报告变化;受控用法下它是更新绑定状态的请求。 |
update:isMenuOpen | (isOpen: boolean) => void | 受控模式下 v-model:isMenuOpen 的更新事件。 |
插槽
| 名称 | 说明 |
|---|---|
icon | 触发器的图案,替换默认的三点图标。触发器始终是纯图标按钮,无障碍名称来自 label。 |
暴露的方法
| 名称 | 类型 | 说明 |
|---|---|---|
element | HTMLElement | null | 触发按钮的 DOM 元素。 |
focus | (options?: FocusOptions) => void | 把焦点移到触发按钮上。 |
blur | () => void | 移除触发按钮上的焦点。 |
原生属性
根元素为 <span>,触发按钮是它内部的 <button>。
传入组件的 class、style、data-* 等属性会透传到根元素上。触发按钮的无障碍名称取 label,它的 aria-expanded、aria-haspopup 与 aria-controls 由组件按打开状态与呈现形态自行维护。
打开时,菜单表面会移动到文档末尾(<body> 之下)作为浮层呈现;设置 is-inline 可以让它留在原地。