Skip to content

Menu 导航菜单

为页面、侧边栏和应用顶部提供导航,使用 Vue 组件的声明式 props、v-model 和事件风格。

配置式 API

为什么不暴露子组件命名空间

ccui 的 <c-menu>配置式 API:所有菜单项、子菜单、分组、分割线都通过 items: MenuItem[] prop 用 type 字段表达,不暴露 Menu.SubMenu / Menu.ItemGroup / Menu.Divider 子组件命名空间(与 ccui「平铺独立顶层组件,不挂静态属性」原则一致)。

Menu 数据结构高度规整(树形 + 类型枚举),配置式 API 在动态菜单(如基于后端权限)场景比模板式更简洁;模板式如 <c-sub-menu> 等子组件如有强需求,留作后续演进项。

各菜单项类型通过 items.type 区分:

type形状说明
'item'{ key, label, icon? }普通菜单项(默认)
'submenu'{ key, label, type: 'submenu' | undefined, children: MenuItem[] }children 即为子菜单
'group'{ key, label, type: 'group', children: MenuItem[] }分组容器(不可点)
'divider'{ key, type: 'divider' }分割线

type 字段缺省时自动推断:有 children 视为 'submenu',无 children 视为 'item'

基本使用

内联子菜单

默认展开与默认选中

适合只需要初始化状态的场景,后续由组件内部状态维护。需要由业务状态接管时,使用 v-model:selected-keysv-model:open-keys

多选菜单

分组、分割线和额外内容

暗色主题和收起

参数类型默认值说明
modevertical / horizontal / inlinevertical菜单类型
themelight / darklight主题
itemsMenuItem[][]菜单数据
selectedKeys(string | number)[][]当前选中的菜单项,支持 v-model:selected-keys
defaultSelectedKeys(string | number)[][]默认选中的菜单项
openKeys(string | number)[][]当前展开的子菜单,支持 v-model:open-keys
defaultOpenKeys(string | number)[][]默认展开的子菜单
inlineIndentnumber24inline 模式下每级缩进
collapsedbooleanfalse收起菜单,保留兼容属性
inlineCollapsedbooleanundefinedinline 模式收起状态,优先级高于 collapsed
multiplebooleanfalse是否允许多选
selectablebooleantrue是否允许选中菜单项
disabledbooleanfalse是否禁用整个菜单
accordionbooleanfalse是否只展开一个顶层子菜单
forceSubMenuRenderbooleanfalse是否强制渲染未展开的子菜单 DOM
triggerSubMenuActionclick / hoverclick子菜单展开触发方式
ts
interface MenuItem {
  key: string | number
  label?: VNodeChild
  title?: string
  icon?: string
  disabled?: boolean
  danger?: boolean
  extra?: VNodeChild
  type?: 'item' | 'submenu' | 'group' | 'divider'
  children?: MenuItem[]
}

Events

事件说明
update:selectedKeys选中项变化,用于 v-model:selected-keys
update:openKeys展开项变化,用于 v-model:open-keys
click点击菜单项,参数为 MenuInfo
select选中菜单项,参数为 MenuInfo
deselect多选模式下取消选中,参数为 MenuInfo
open-change子菜单展开状态变化,参数为 (openKeys, MenuOpenInfo)
openChangeopen-change 的 camelCase 事件别名

键盘交互

  • ArrowUp / ArrowDown:在可见菜单项中移动焦点。
  • ArrowLeft / ArrowRight:在水平菜单中移动焦点,在子菜单上收起或展开。
  • Enter / Space:选中当前菜单项或切换当前子菜单。

Released under the MIT License.