Skip to content

FxMenu 侧边栏菜单

侧边栏导航菜单,由 FxMenu(容器)、FxMenuItem(叶子项)、FxSubMenu(可折叠子菜单)三个组件组合使用。不依赖任何 UI 框架,内部复用 FxScrollbar(滚动 + 激活项自动滚入视)与 FxTooltip(折叠态叶子项提示),样式走 @fx/styles--menu-* token,亮暗自动跟随。支持 rounded(圆润,默认)与 plain(朴素)两种风格模式。

基础用法

FxMenu 包裹若干 FxMenuItem / FxSubMenu。点击叶子项切换激活态,激活项会自动滚入可视区。

折叠态(collapsed)

collapsedtrue 时,侧边栏收起为图标列:叶子项文本隐藏,悬浮显示 tooltip;子菜单改为右侧弹层(支持嵌套悬浮与级联关闭)。has-active-descendant 用于告知子菜单"子树含激活项",从而高亮父级。

手风琴模式(accordion)

默认开启:同级只展开一个子菜单,展开新的一项会自动收起兄弟项。设为 false 可同时展开多个。

风格模式(style-type)

style-type 切换两种视觉风格(参考 vben):

  • rounded(圆润,默认):菜单项圆角 + 左右留白。
  • plain(朴素):菜单项直角 + 顶满侧边栏(无外边距),更扁平紧凑。

两种模式的激活态一致——半透明主色底 + 主色字(无阴影),差异仅在圆角与外边距。切换纯靠 CSS 变量,不改结构。

业务层适配

FxMenu 只负责 UI,不关心数据来源。业务侧通常再包一层"数据适配组件",把后端菜单或路由表递归映射成 FxMenuItem / FxSubMenu,激活判断与路由跳转留在业务层:

vue
<FxMenu :collapsed="collapsed" :accordion="accordion">
  <AdapterItem
    v-for="node in menus"
    :key="node.id"
    :menu="node"
  />
</FxMenu>
ts
// AdapterItem.vue(业务侧,递归)
<FxSubMenu
  v-if="node.children?.length"
  :title="node.name"
  :icon="node.icon"
  :has-active-descendant="isDescendantActive(node)"
>
  <AdapterItem
    v-for="child in node.children"
    :key="child.id"
    :menu="child"
    :level="level + 1"
  />
</FxSubMenu>
<FxMenuItem
  v-else
  :title="node.name"
  :icon="node.icon"
  :active="isActive(node)"
  :level="level"
  @click="router.push(node.path)"
/>

FxMenu API

Attributes

属性说明类型默认值
collapsed是否折叠(侧边栏收起为图标列)booleanfalse
accordion手风琴模式:同级只展开一个子菜单booleantrue
style-type风格模式:rounded 圆润 / plain 朴素'rounded' | 'plain'rounded

Slots

插槽名说明
default菜单内容,通常是 FxMenuItem / FxSubMenu

Exposes

属性说明
scrollActiveIntoView手动滚动使激活项进入可视区
scrollbarRef内部 FxScrollbar 实例(透传,可调 scrollTo 等)

FxMenuItem API

Attributes

属性说明类型默认值
title标题(折叠态作为 tooltip 文案)string''
icon图标。字符串为 IconString 类型(即 FxIcon 图标名,如 ep:settingant-design:homesvg:xxxstring
active是否激活booleanfalse
level层级(控制缩进,业务层递归 +1)number0

Slots

插槽名说明
default自定义标题内容(覆盖 title

Events

事件名说明
click点击菜单项

FxSubMenu API

Attributes

属性说明类型默认值
title子菜单标题string''
iconFxIcon 图标名string
level层级(控制缩进)number0
has-active-descendant子树是否含激活项(业务层据路由判断后传入,驱动自动展开)booleanfalse

Slots

插槽名说明
default子菜单内容(菜单项 / 嵌套子菜单)

设计要点

  • 状态解耦:折叠态 / 手风琴由 FxMenu 的 props 驱动,经 provide/inject 下发,组件不耦合消费方的状态来源。
  • 激活自动滚动FxMenu 内部用 MutationObserver 监听 .is-active 变化,自动把激活项(含上下相邻项)滚入可视区。
  • 折叠态 tooltip 仅在顶层 rail(FxMenu 直接子级叶子项)显示;子菜单内的项文本始终可见,不重复弹 tooltip。
  • 配色 / 圆角 / 阴影 / 间距全部走 @fx/styles--menu-* / --color-* token,暗色模式随 token 自动适配。 :::