Props
| 名称 | 类型 | 默认值 | 说明 |
|---|
button | DropdownMenuButtonProps | { label: 'Menu' } | 触发按钮的属性,等同于 Button 的属性(其中 clickAction 除外,避免和菜单抢同一次点击)。size 会同时决定菜单行的高度。 |
items | DropdownMenuOption[] | - | 数据式菜单内容。每条可以是一条动作、一条分隔线 { type: 'divider' },或一个分组 { type: 'section', title, items }。与默认插槽互斥,同时给出时以 items 为准。 |
isMenuOpen | boolean | - | 受控的展开状态,配 v-model:is-menu-open 使用。留空时菜单自己管理开关。挂载时即为 true 不会移动焦点。 |
menuWidth | number | string | - | 菜单的最小宽度。长度值可以随内容变宽;max-content 之类的固有尺寸关键字则作为首选宽度。所有写法都会受视口限制。留空时与触发按钮齐平,并封顶在 320px。 |
menuMaxHeight | number | - | 菜单的最大高度,单位为像素,用于必须放下所有行的菜单。它会抬高默认的 300px 上限,但视口仍然限住实际高度。 |
placement | 'above' | 'below' | 'start' | 'end' | 'below' | 菜单相对触发按钮的位置。空间不足时自动翻到相反方向。 |
alignment | 'start' | 'center' | 'end' | 'start' | 菜单沿位置方向与触发按钮的对齐方式。 |
hasChevron | boolean | true | 是否在触发按钮尾部显示箭头。纯图标按钮不会显示。 |
| 名称 | 类型 | 默认值 | 说明 |
|---|
label | string | number | - | 行内的主要文字。需要富文本时改用 label 插槽。 |
description | string | number | - | 标签下方的次要说明文字。需要富文本时改用 description 插槽。 |
icon | string | Component | - | 标签前的图标:一个 CSS 图标类(例如 UnoCSS 的 i-carbon-copy,也可以是你自己的类名),或一个绘制 SVG 的组件。astryx-vue 不自带图标。想放任意内容时改用 icon 插槽。 |
isDisabled | boolean | false | 禁用这一行。禁用的行会被方向键和字母跳转跳过,并且不响应点击。 |
variant | 'default' | 'destructive' | 'default' | 视觉变体。destructive 会把标签、说明和图标一起换成错误色,用于删除这类危险动作。悬停底色仍是共用的中性色,与其他行一致。 |
hasCloseOnSelect | boolean | true | 激活这一行后是否收起菜单。像“复制”这种在行内回报结果的动作可以设为 false。 |
href | string | - | 这一行要跳转的地址。给出后整行就是一个带 role="menuitem" 的链接,所以 ⌘/Ctrl 点击和中键点击仍然保持浏览器原本的含义。 |
target | '_blank' | '_self' | - | 链接的打开方式,仅在给出 href 时使用。 |
rel | string | - | 链接关系,仅在给出 href 时使用。target="_blank" 时会自动加上 noopener 和 noreferrer。 |
onClick | (event: MouseEvent) => void | - | 激活这一行时调用。链接行会在浏览器跳转前调用;带修饰键的点击交给浏览器处理,不调用它。 |
| 名称 | 类型 | 默认值 | 说明 |
|---|
title | string | number | - | 分组上方的标题,同时作为这一组的无障碍名称。留空时分组没有名字。 |
DropdownMenuDivider 没有属性,它渲染一条 role="separator" 的分隔线,因此永远不会成为方向键的一站。
事件
| 名称 | 参数 | 说明 |
|---|
update:isMenuOpen | boolean | 展开状态发生变化,配合 v-model:is-menu-open 使用。 |
openChange | boolean | 展开状态发生变化时触发,与 update:isMenuOpen 同时发出。 |
click | - | 触发按钮被激活时触发(打开和收起都会触发)。 |
click(DropdownMenuItem) | MouseEvent | 这一行被激活时触发。 |
插槽
| 名称 | 说明 |
|---|
default | 自己写菜单内容时使用:DropdownMenuItem、DropdownMenuGroup 和 DropdownMenuDivider。与 items 互斥。 |
trigger | 自定义触发控件时使用。插槽参数包含 id、aria-haspopup、aria-expanded、aria-controls、onClick 和 onKeyDown,请整份 v-bind 到控件上。 |
icon(DropdownMenuItem) | 代替 icon 属性的任意起始内容。 |
label / description(DropdownMenuItem) | 代替同名属性的富文本内容。 |
endContent(DropdownMenuItem) | 行尾内容,例如一个 Kbd 快捷键提示。 |
title / default(DropdownMenuGroup) | 分组的富文本标题,以及组内的行。 |
原生属性
除下表列出的属性外,其余原生属性会落到菜单浮层元素上:
- HTML 属性、
data-* 属性。 aria-* 属性。class、style。
菜单元素默认带一个生成的 id,触发按钮的 aria-controls 指向它。显式传入 id 会同时替换这个生成的 id 和 aria-controls 的值,两者不会脱节。传入 aria-label 或 aria-labelledby 会覆盖菜单默认的名称(默认取自触发按钮的文字,自定义触发控件时则指向控件自身)。
触发按钮上会带上 aria-haspopup="menu"、aria-expanded 和 aria-controls;触发按钮外层是一个用于定位的 span.astryx-dropdown-menu-trigger。