Menu 菜单
按层级组织页面导航。
基本用法
通过 itemRender 在菜单文字后追加状态标签和数字标签。一级菜单保留图标,二级菜单仅展示文字,并与一级菜单文字对齐。子菜单采用更紧凑的行高与较淡的文字;可选条目悬停和按下时仅改变文字颜色,选中项保留底色,祖先菜单保持普通样式。
排列方式
通过 Tabs 切换垂直、内嵌、横向和折叠侧栏。垂直与内嵌示例默认展开子菜单;横向导航和折叠侧栏使用浮层展示二级菜单。折叠侧栏还可以通过按钮展开,比较两种状态。
垂直菜单分组
在 items 中使用 type: 'group',通过 label 设置分组标题、children 设置菜单项。标题支持 ReactNode,不参与选择和方向键导航;折叠菜单隐藏标题,保留菜单项。
复用分组标题
MenuGroup 复用菜单的分组标题样式,title 接受 ReactNode,children 可以放菜单、说明、按钮或任意自定义元素。只有菜单项时优先使用上面的 items 分组,共享同一个 Menu 的选择状态与键盘导航。
自定义内容可以作为 Menu 的相邻区域放进独立的 MenuGroup,控件保留自己的 Tab 顺序和键盘行为。MenuGroup 自身不管理选中项、展开或折叠;侧栏收起时,由应用决定是否隐藏这个区域。
受控导航与路由
selectedKey 跟随当前路由。linkRender 可替换默认链接,例如 React Router 或 Next.js 的 Link;保留传入链接的事件、类名和 ARIA 属性。
使用说明
纵向菜单默认 240px,折叠时 60px,可通过 style.width 调整。items 支持嵌套、分组、分隔线与链接。selectedKey 管理当前选中项,openKeys 管理展开项;横向模式与折叠模式使用浮层展示子菜单。
横向导航的子菜单在触发项下方展开;折叠侧栏的子菜单向侧边展开,并显示父级标题。浮层统一图标、文字、分组与选中背景,仅当前页面高亮,所属父项保持普通样式。RTL 布局自动反转侧向展开方向,靠近屏幕边缘时浮层会调整位置。
子菜单展开、收起以及侧栏宽度变化均带有过渡。收起的子项不会参与键盘导航;系统开启减少动态效果时,过渡会自动关闭。
菜单项、悬停背景和选中高亮与按钮共用基础圆角。通过 ConfigProvider 的 theme.borderRadius 统一调整,也可用 theme.components.Menu.borderRadius 单独设置菜单圆角。
可选条目悬停、键盘聚焦和按下时只改变文字与图标颜色,背景保持不变,选中项保留主题色底色;危险项使用危险色反馈。带子菜单的展开项继续使用浅色悬停背景和较深的按下背景。子菜单浮层沿用相同规则,子菜单默认行高为 32px,紧凑密度为 26px,并跟随区域控件高度调整。
类型
组装数据、定义回调和使用 ref 时,可以导入这些类型。
MenuItem API
MenuProps API
MenuGroup API
支持原生 div 属性及指向 HTMLDivElement 的 ref。分组通过标题提供可访问名称,也可用 aria-label 或 aria-labelledby 覆盖。可从根入口或 @ifhover/leaf-ui/menu 导入。