AdmSysV2【公共组件库】@前端(For Git Submodule)
edit | blame | history | raw

侧栏菜单(Side Menu)— 架构 / 产品决策

状态:生效中

本文记录侧栏菜单相关**取舍**;行为细节以 spec.md 为准,**可勾选验收**以 task.md 为准。


同级手风琴式展开

  • 状态:生效
  • 上下文:多级菜单若允许多个同级分支同时展开,信息密度高、滚动长,且与常见后台导航习惯不一致。
  • 决策:在**同一父节点下**,同时仅保留一个展开子分支;用户显式收起时尊重其操作。
  • 后果:需在 Ant Design MenuonOpenChange 与自定义子菜单层**两处**保持一致语义,避免二级与三级行为分裂。SPEC §4.2。

断点以下采用固定全宽 + 遮罩

  • 状态:生效
  • 上下文:窄屏下窄侧栏可读性与可点性差,且需让出主内容区。
  • 决策:低于 lg 量级断点时侧栏改为覆盖式(fixed),展开时配合全宽类表现与遮罩,点击遮罩关闭。
  • 后果:与宿主折叠状态强耦合;须通过回调同步。SPEC §3.2、§4.5。

固定模式下延迟导航

  • 状态:生效
  • 上下文:收起动画与立即路由/开页同时进行时易出现闪烁或竞态。
  • 决策:固定模式下先触发收起,再延迟约 300ms 调用「打开页」。
  • 后果:实现须严格保证顺序;延迟与壳子动画时长应对齐。SPEC §4.3。

自定义滚动条而非纯系统滚动条

  • 状态:生效
  • 上下文:深色主题侧栏与系统滚动条样式、宽度不一致时破坏视觉对齐;需统一轨道与滑块。
  • 决策:在内容可滚动时使用自绘轨道/滑块,并与 scrollTop 同步;resize 时重算。
  • 后果:实现复杂度高于原生滚动条;需处理拖拽与遮罩的交互冲突及多段动效。SPEC §4.4、§4.5、§5.3。

菜单数据由宿主注入

  • 状态:生效
  • 上下文:权限、租户、动态路由等差异应在壳子或数据层处理。
  • 决策:组件只消费树与运行态,不内置请求与策略。
  • 后果:SPEC 必须写清数据字段与回调语义,否则对接易歧义。SPEC §2、§6。

静态路径骨架与接口权限数据分离

  • 状态:生效
  • 上下文:常见做法是静态配置中的 treePaths 固定页面路径与分组,接口返回分组/条目做权限与展示控制,二者在宿主或数据层合并。
  • 决策:侧栏组件不直接读取静态配置文件;仅展示宿主传入的**已合并** tree。路径与 pageName 的权威定义在数据层。
  • 后果:「菜单从哪来」须在宿主或数据层单独说明;侧栏 TASK 以合并后数据验收。SPEC §2.3、§2.4。

侧栏外「按 pageName 找页」与多级树的潜在不一致(宿主债)

  • 状态:生效(已知限制)
  • 上下文:若宿主提供「按 pageName 打开页」的辅助逻辑,且实现为仅在每个分组下**一层** items 上线性扫描,则一旦静态或合并后的树出现**嵌套二级以上的可点击页**,会找不到或行为错误。
  • 决策:不在侧栏组件内解决;由宿主保证「按名开页」与真实树深度一致(必要时改为递归查找)。
  • 后果:侧栏实现三级 UI 时,应提醒宿主团队校对同类辅助方法。与 SPEC §2.1 层级支持配套。

onSetMenuCollapse 支持 boolean 与无参两种调用

  • 状态:生效
  • 上下文Layout.Sider 断点回调常传入 broken,顶栏按钮则多触发无参「切换」。
  • 决策:宿主统一处理:boolean 时设为对应折叠态,无参时按约定切换或收起。
  • 后果:侧栏须能触发上述两类调用,避免 antd@6 升级后只处理其中一种。SPEC §6.2。

修订记录

日期 摘要
2026-04-07 初稿
2026-04-07 明确验收以 task.md 为准
2026-04-07 补充路径骨架与 API 分离、折叠回调双形态、按 pageName 查找层级限制
2026-04-07 去除具体文件/类名,改为职责级描述
2026-04-07 节号随 SPEC §5 动效 / §6 契约调整