Skip to content

Menu 菜单

独立的菜单列表,支持选中态与键盘导航。

基础用法

基础用法

默认选中

默认选中(value 回显)

禁用项

禁用项

多级子菜单

children 的菜单项显示展开箭头(›),点击或悬停展开子菜单,子菜单缩进展示;键盘 ArrowRight 进入、ArrowLeft 返回。

多级子菜单

尚未选择

水平导航

mode="horizontal" 时菜单项横排,呈顶部导航条样式;一级子菜单向下浮出,二级及以上仍向右浮出。

水平导航(顶部导航条样式)

尚未选择

收起态

collapsed(仅 vertical 生效)将菜单收窄为只显示图标,悬停或点击图标项时子菜单向右浮出,子菜单内仍为完整菜单。

收起态(只显示图标)

尚未选择

分组

type: "group" 的菜单项渲染为带组标题的分区(组标题小字、次要色、不可点),组内子项平铺在同一层,可继续混入子菜单与分隔线。

分组

带图标

icon 使用 @oas-ui/icons 的图标名(iconRegistry),以内联 SVG 渲染在文字左侧。

带图标

分隔线

type: "divider" 渲染一条细分隔线,不可点、不参与键盘导航。

分隔线

暗色菜单

theme="dark" 使菜单局部使用暗色 token(深背景 + 浅文字),独立于全局主题;不设置时跟随全局主题。

暗色菜单

选择事件

选择事件

尚未选择

多选(checkbox)

kind: "checkbox" 的叶子项渲染为方块勾选框(role="menuitemcheckbox",与 radio 的 ✓ 区分);多选勾选集以 JSON 数组形态写入 value,点击某项后 oas-selectdetail 携带 checked(本次点击后的勾选态)。

多选(checkbox)

尚未勾选

危险操作项

danger: true 使用红色语义(--oas-color-danger),用于删除、退出登录等危险操作;hover / 键盘高亮时红底加深。

危险操作项(danger)

尚未选择

链接项(href)

href 使菜单项渲染为 <a>(锚点语义:支持中键 / 右键新窗口,SEO 友好),target / rel 原样透传;点击仍会派发 oas-select 并写入选中态。示例链接用 target="_blank" 新开标签页,避免离开文档页。

链接项(href)

尚未选择

长菜单滚动

max-height 限定菜单可视高度(纯数字自动补 px),超出部分在菜单内部滚动,适合长列表。

长菜单滚动(max-height)

字符定位(typeahead)

菜单聚焦后直接输入字符,即跳转到 label 匹配的项(连续字符缓冲,500ms 无输入自动重置;前缀匹配优先,无前缀则包含匹配)。示例标签带英文便于按键触发:按 c 跳到 Copy,继续按 u(组合 cu)跳到 Cut。

字符定位(typeahead)

菜单已聚焦,直接按键试试(如 c → Copy、cu → Cut)

inline 侧边导航

mode="inline" 时子菜单就地展开(不浮出),是侧边导航的主流形态;展开 / 收起带高度过渡动画,支持多级嵌套。

inline 就地展开

受控展开

expanded(JSON 数组)为受控属性:外部设置 / 更新它即可指定展开的子菜单集合;每次展开 / 收起派发 oas-expand-changedetail: { expanded, value, isExpanded }),受控场景下宿主据此把状态写回 expanded

expanded 受控展开

展开「工作台」展开「消息中心」全部收起尚未操作

选中不收起

浮出形态(vertical / horizontal)默认选中叶子项即收起展开的子菜单(展开态是临时的);close-on-select="false" 可保持展开,适合在浮层里连续选多项。mode="inline" 侧边导航默认不收(用户需看到所在分区),close-on-select="true" 可改为收起。kind="checkbox" 项的勾选切换永不收起。

选中不收起(close-on-select)

vertical + close-on-select="false":点叶子后子菜单保持展开

尚未选择

inline + close-on-select="true":点叶子后收起父级子菜单

尚未选择

手风琴

accordion(配合 mode="inline")使同级子菜单互斥:展开一个自动收起同级的其他展开项。

手风琴互斥(inline + accordion)

水平溢出收纳

mode="horizontal" 下容器宽度不足时,超宽的菜单项自动收进末尾「···」子菜单,导航条不换行、不截断。

水平溢出收纳

API

属性

属性说明类型默认值
accordion手风琴互斥(inline 模式同级只展开一个子菜单)boolean
close-on-select选中叶子项后是否收起展开的子菜单。缺省分形态:inline 侧边导航不收、浮出形态收;checkbox 项勾选切换永不收起string
collapsed收起态(仅 vertical):只显示图标,子菜单向右浮出
expanded受控展开项集合(JSON 数组字符串,inline 模式哪些子菜单展开);非受控时内部管理string
items菜单项 JSON(支持 disabled / loading 禁点、icon、children 子菜单)string[]
max-height长菜单最大高度,超出内部滚动(数字补 px)string
mode布局模式:vertical 纵向菜单 / horizontal 顶部导航条
theme局部主题:dark 使用暗色 token(独立于全局主题)
value当前选中值。纯字符串时全局单选(无组场景,兼容旧用法);JSON 对象字符串(如 {"sort":"name","view":"list"})时按组 id 作用域独立记录——type:"group" 项的 value 作组 id,组内点选只更新该组string

事件

事件说明
oas-expand-change子菜单展开状态变化,detail: { expanded: string[], value, isExpanded }(受控/非受控都派发)
oas-select选择某项,detail: { value, kind? }kind 仅动作项(kind: "action")出现,值为 "action";radio 项 detail.kind 不出现

MenuItem 字段:

字段说明类型
label菜单项文字string
value选中值string
type菜单项类型:item(默认)/ group(分组标题)/ divider(分隔线)string
kind叶子项语义:radio(默认,可勾选)/ action(动作项,无勾选态、点击不写回 value)string
icon图标名(@oas-ui/icons 的 iconRegistry 键)string
disabled禁用该项boolean
children子菜单项数组,结构与父项一致(可继续嵌套)MenuItem[]

children 为可选子菜单项数组;有 children 的项点击/悬停展开子菜单,选中态只落在叶子项。groupchildren 平铺展示在同一层,组标题不可点、不参与键盘导航;divider 不可点、不参与键盘导航。

键盘导航:方向键移动(自动跳过组标题与分隔线)、Enter 选择(含子菜单的项 Enter/ArrowRight 进入)、Home / End 跳转、ArrowLeft 返回父级;role="menu" + menuitemradio(子菜单父项为 menuitem),选中项显示对勾。

基于 MIT OR Apache-2.0 双许可发布