首页/新闻资讯/正文详情

ng-zorro-antd 菜单类型动态切换实战:在 inline 与 vertical 模式之间自由切换

发布时间:2026/9/27 10:12:59 来源:云帆数科 栏目:资讯中心
ng-zorro-antd 菜单类型动态切换实战:在 inline 与 vertical 模式之间自由切换
UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载导读菜单Menu是导航类页面的核心组件而动态切换菜单类型是后台管理系统中最常见的一类交互需求——同一套菜单结构需要跟随用户偏好或设备宽度在inline内联与vertical垂直弹出两种模式间即时切换甚至同步切换light/dark主题。本篇基于 ng-zorro-antd 官方演示switch-mode展开先给出可直接复制的完整示例代码再深入 menu.directive.ts 与 submenu.component.ts 源码讲清模式切换背后子菜单渲染形态如何改变、打开状态如何重置的底层机制。读完你可以独立实现一个可实时切换模式与主题的导航菜单。演示场景展示动态切换模式该演示的核心意图只有一句话展示动态切换模式between inline and vertical。它通过两个nz-switch开关分别控制菜单类型Modevertical与inline之间切换菜单主题Themedark与light之间切换。切换是即时的无需重新渲染页面菜单内的三级子菜单结构保持不变。这正是 switch-mode.ts 所呈现的效果也是它区别于其他 demo如固定模式的 vertical、inline的关键模式作为可变的响应式状态绑定到[nzMode]。完整可运行示例代码拆解官方演示的完整代码如下见 switch-mode.tsimport { Component, signal } from angular/core; import { FormsModule } from angular/forms; import { NzDividerModule } from ng-zorro-antd/divider; import { NzMenuModule } from ng-zorro-antd/menu; import { NzSwitchModule } from ng-zorro-antd/switch; Component({ selector: nz-demo-menu-switch-mode, imports: [FormsModule, NzDividerModule, NzMenuModule, NzSwitchModule], template: nz-switch [(ngModel)]mode / Change Mode nz-divider nzTypevertical / nz-switch [(ngModel)]dark / Change Theme br / br / ul nz-menu [nzMode]mode() ? vertical : inline [nzTheme]dark() ? dark : light li nz-submenu nzTitleNavigation One nzIconmail ul li nz-menu-group nzTitleItem 1 ul li nz-menu-itemOption 1/li li nz-menu-itemOption 2/li /ul /li li nz-menu-group nzTitleItem 2 ul li nz-menu-itemOption 3/li li nz-menu-itemOption 4/li /ul /li /ul /li li nz-submenu nzTitleNavigation Two nzIconappstore ul li nz-menu-itemOption 5/li li nz-menu-itemOption 6/li li nz-submenu nzTitleSubmenu ul li nz-menu-itemOption 7/li li nz-menu-itemOption 8/li /ul /li /ul /li li nz-submenu nzTitleNavigation Three nzIconsetting ul li nz-menu-itemOption 9/li li nz-menu-itemOption 10/li li nz-menu-itemOption 11/li /ul /li /ul , styles: [nz-menu] { width: 240px; } }) export class NzDemoMenuSwitchModeComponent { readonly mode signal(false); readonly dark signal(false); }关键点逐项说明模块依赖NzMenuModule提供nz-menu指令及子组件NzSwitchModule提供开关NzDividerModule用于分隔两个开关FormsModule是[(ngModel)]双向绑定所必需。状态管理组件用 Angular 的signal声明mode与dark两个布尔状态默认均为false即初始呈现inline模式 light主题。双向数据流nz-switch [(ngModel)]mode /把开关值与信号绑定模板中通过mode() ? vertical : inline三元表达式实时计算nzMode取值。开关一拨菜单类型即刻变化。菜单结构三个nz-submenu顶级子菜单Navigation One / Two / Three内部混合使用nz-menu-group分组、nz-menu-item菜单项以及嵌套的二级nz-submenuSubmenu覆盖了内联模式下最常见的多级场景。样式上给[nz-menu]固定了240px宽度便于观察内联与垂直弹出两种形态的差异。模式与主题相关的核心 API模式切换本质上是在操作[nz-menu]指令的两个输入属性。下表整理自菜单官方文档 doc/index.en-US.md并对照 menu.directive.ts 源码中的实际默认值属性说明类型默认值[nzMode]菜单类型支持vertical、horizontal、inlinevertical \| horizontal \| inlinevertical[nzTheme]菜单颜色主题light \| darklight[nzInlineCollapsed]inline模式下是否折叠booleanfalse[nzInlineIndent]inline模式下每一级菜单项的缩进像素值number24[nzSelectable]是否允许选中菜单项booleantrue(nzClick)点击nz-menu-item时的输出事件EventEmitterNzMenuItemComponent—其中nzMode与nzTheme的取值类型在 menu.types.ts 中有明确定义export type NzMenuModeType vertical | horizontal | inline; export type NzMenuThemeType light | dark; export type NzSubmenuTrigger hover | click;nz-submenu子组件还支持nzTriggerSubMenuActionhover | click默认hover控制展开触发方式、nzPlacement控制弹出位置默认bottomLeft、nzOpen默认false控制受控展开状态等详见 submenu.component.ts。源码视角模式切换时内部发生了什么动态切换不是简单的样式替换而是组件内部状态机的一次联动。沿着 menu.directive.ts 的代码可以看清整条链路。1. 输入变化被转发到响应式流NzMenuDirective持有两个BehaviorSubjectmode$与inlineCollapsed$。ngOnChanges中一旦检测到nzMode变化就会把新值推入mode$并主动将所有子菜单的打开状态置为关闭if (nzMode) { this.mode$.next(this.nzMode); if (!nzMode.isFirstChange() this.listOfNzSubMenuComponent) { this.listOfNzSubMenuComponent.forEach(submenu submenu.setOpenStateWithoutDebounce(false)); } }这段代码解释了演示中一个容易被忽略的细节切换模式的瞬间之前展开的子菜单会全部收起。因为inline与vertical的子菜单展开形态完全不同前者是页面内展开后者是浮层弹出保留旧打开状态会造成视觉错乱所以框架选择在模式切换时重置。nzTheme变化则通过setTheme转发给服务层if (nzTheme) { this.nzMenuService.setTheme(this.nzTheme); }2. 模式与折叠共同决定实际模式menu.directive.ts 在ngOnInit中用combineLatest合并inlineCollapsed$与mode$计算出实际生效的模式combineLatest([this.inlineCollapsed$, this.mode$]) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(([inlineCollapsed, mode]) { this.actualMode inlineCollapsed ? vertical : mode; this.nzMenuService.setMode(this.actualMode); this.cdr.markForCheck(); });也就是说即便nzMode设为inline一旦nzInlineCollapsed为true实际模式也会降级为vertical折叠态用弹出浮层展示子菜单。这为后续扩展折叠交互提供了伏笔。3. 服务层广播模式与主题MenuService 是菜单内部各组件共享的中枢通过BehaviorSubject广播状态mode$、theme$、inlineIndent$、isChildSubMenuOpen$等并提供setMode/setTheme/setInlineIndent方法。菜单项与子菜单都订阅这些流来响应变化这正是一个开关、全局联动得以实现的原因。4. 子菜单按模式选择渲染形态这是模式切换最直观的源码体现。在 submenu.component.ts 的模板中if (mode inline)分支渲染内联子菜单nz-submenu-inline-child通过折叠动画在页面内展开否则渲染非内联子菜单nz-submenu-none-inline-child配合cdkConnectedOverlay以浮层弹出if (mode inline) { div nz-submenu-inline-child [open]nzOpen ... ng-template [ngTemplateOutlet]subMenuTemplate / /div } else { ng-template cdkConnectedOverlay [cdkConnectedOverlayPositions]overlayPositions [cdkConnectedOverlayOrigin]origin [cdkConnectedOverlayOpen]nzOpen ... ... /ng-template }子菜单组件在ngOnInit中订阅mode$并据模式切换浮层的定位列表if (mode horizontal) { this.overlayPositions [POSITION_MAP[this.nzPlacement], ...listOfHorizontalPositions]; } else if (mode vertical) { this.overlayPositions listOfVerticalPositions; }vertical模式弹出面板出现在子菜单项右侧或左侧rightTop / right / rightBottom / leftTop / left / leftBottomhorizontal模式弹出面板出现在下方bottomLeft / bottomRight / topRight / topLeft。动画也随之区分在 submenu-non-inline-child.component.ts 中vertical使用ant-zoom-big缩放动画horizontal使用slide-up上滑动画。5. 菜单项与层级缩进inline模式最显著的视觉特征是多级缩进。在 menu-item.component.ts 中菜单项订阅mode$与inlineIndent$仅在inline模式下按层级计算缩进this.inlinePaddingLeft mode inline ? this.level * inlineIndent : null;对应 submenu.component.ts 中同样的计算逻辑inlinePaddingLeft mode inline ? this.level * inlineIndent : null。默认nzInlineIndent 24即每深入一级缩进 24px。三种模式的适用场景与子菜单行为对比模式子菜单形态典型场景演示参考inline页面内折叠展开nz-submenu-inline-child 折叠动画侧边导航、多级目录树inline demovertical右侧/左侧浮层弹出zoom-big 动画下拉式导航、抽屉内菜单vertical demohorizontal下方浮层弹出slide-up 动画顶部导航栏horizontal demo此外 inline-collapsed.ts 演示了inline模式下的折叠态折叠时actualMode降级为vertical子菜单改以浮层展示——这与上文combineLatest的逻辑完全对应。扩展实战把模式切换接入布局骨架switch-mode演示的是一块独立菜单的切换。在实际后台系统中更常见的做法是把mode状态提升到根组件与 Layout 的Sider联动侧边栏展开时菜单为inline收起时切换为vertical弹出。也可以参考 sider-current.ts 的侧边栏中选中项自动高亮写法结合nzMatchRouter让菜单跟随路由高亮再配合 theme.ts 将nzTheme状态与全局主题配置统一管理。实现时需注意两点若菜单放在侧边栏中应让nz-menu的宽度与Sider宽度保持一致避免vertical弹出浮层定位偏差模式切换会重置所有子菜单的展开状态源码已保证因此不要依赖切换前后子菜单保持展开的行为必要时在切换后通过nzOpen受控属性主动恢复。小结切换菜单类型演示虽小却是理解 ng-zorro-antd 菜单架构的最佳入口一个nzMode输入背后串联起NzMenuDirective的响应式流、MenuService的状态广播、子菜单按模式切换渲染形态内联展开 vs CDK Overlay 浮层、定位与动画的联动以及菜单项层级缩进的重算。掌握这条链路后无论是要做顶部导航、侧边导航还是折叠交互都能基于同一套菜单结构快速落地。赞分享UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载相关推荐Ant Design Menu 动态切换模式实战在 inline 与 vertical 之间实时切换导航布局Ant Design Menu 动态切换模式实战在 inline 与 vertical 之间实时切换导航布局 导读 本文基于 ant design 仓库 Me前端UI组件设计系统ng-zorro-antd FloatButton 形状详解用 nzShape 在圆形与方形之间切换ng zorro antd FloatButton 形状详解用 nzShape 在圆形与方形之间切换 导读 nz float button 浮动按钮是 nUI组件前端antd ColorPicker 渐变色模式实战用 mode 在单色与线性渐变之间自由切换antd ColorPicker 渐变色模式实战用 mode 在单色与线性渐变之间自由切换 导读 ColorPicker 组件默认只能选取单一颜色而通过 5前端UI组件设计系统上一篇CherryUSB为什么这款嵌入式USB协议栈是资源受限系统的终极解决方案下一篇终极嵌入式USB开发指南为什么CherryUSB是资源受限设备的最佳选择创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Operator SDK v1.23.0 版本解析:新增插件、多架构校验与关键修复全景
Operator SDK v1.23.0 版本解析:新增插件、多架构校验与关键修复全景

云原生后端开发工具微服务 【免费下载链接】operator-sdk SDK for building Kubernetes applications. Provides high level APIs, useful abstractions, and project scaffolding. 项目地址: https://gitcode.com/gh_mirrors/op/operator-sdk 点击查看 免费下载 本… · 2026/9/27 10:12:53

注册域名后怎么建设网站?新手避坑指南一文搞懂
注册域名后怎么建设网站?新手避坑指南一文搞懂

注册域名后怎么建设网站?新手避坑指南一文搞懂 找建站公司最怕啥?怕被坑高价,最后花大钱买了个套壳站,改个颜色收三千,加个功能收五千。很多新手注册完域名就懵了,不知道下一步该找谁,怎么防骗,怎么把站建起来还省钱。… · 2026/9/27 10:12:41

ChatGPT-Shortcut 仓库同步更新指南:让 Fork 自动跟随上游,告别 Vercel“有更新“提示
ChatGPT-Shortcut 仓库同步更新指南:让 Fork 自动跟随上游,告别 Vercel“有更新“提示

AI 应用提示工程人工智能前端 【免费下载链接】ChatGPT-Shortcut Stop writing prompts from scratch — a searchable prompt library for ChatGPT, Claude, Gemini and Cursor Русский 한국어 العربية हिन्दी ไทย | 别再从头写提示词&… · 2026/9/27 10:12:28

驱动能跑却会崩?量产级嵌入式驱动的稳定性攻坚指南
驱动能跑却会崩?量产级嵌入式驱动的稳定性攻坚指南

在实际的驱动开发项目里,"驱动能跑了"和"驱动没问题了"是两句经常被混为一谈的话。如果你做嵌入式开发的时间够长,一定遇到过我前面描述的那一幕:代码在开发板上调通了,串口输出正常,功能测试全过… · 2026/9/27 10:56:52

群辉做网站服务器python到底多少钱?避坑指南
群辉做网站服务器python到底多少钱?避坑指南

群辉做网站服务器python到底多少钱?避坑指南 模板网站太丑不够用,想自己用Python搞个服务器部署,到底要花多少钱?这是很多刚入行的东北前端兄弟常问我的问题。别急,咱们今天不整那些虚头巴脑的理论,直接上干货,把成本算得明明白白,让你心… · 2026/9/27 10:56:46

Agilent 53150A微波频率计原理与高精度测量实践
Agilent 53150A微波频率计原理与高精度测量实践

1. 这台“老将”到底能干啥?——Agilent 53150A不是万能表,但它是频率测量领域的“精密标尺”Agilent 53150A 频率计,这个名字在电子测试实验室里,尤其是做射频、微波、时钟源校准和通信系统验证的工程师嘴里,从来不是… · 2026/9/27 10:56:46

5557连接器选型与供应商对比实战指南
5557连接器选型与供应商对比实战指南

干硬件和供应链这行,最烦的就是找料。芯片缺、电阻涨价这些还能忍,最容易被忽视的反而是连接器这种不起眼的玩意儿——画原理图的时候它就是一个小方块,等要打样、要量产了才发现,同样写着“5557-2P”,有的厂报价几分钱… · 2026/9/27 10:56:46

Ubuntu 22.04 / 24.04 / 26.04 更换国内阿里源完整教程(区分 DEB822 新 / 旧源格式)
Ubuntu 22.04 / 24.04 / 26.04 更换国内阿里源完整教程(区分 DEB822 新 / 旧源格式)

前言随着 Ubuntu 版本迭代,APT 软件源配置分为两种格式:传统单行 sources.list 格式与全新 DEB822 标准格式,不同版本配置文件路径、写法完全不同,混用会直接报格式错误。Ubuntu22.04:仅使用 /etc/apt/sources.list 老… · 2026/9/27 10:56:46

源码+样机定制项目成本拆解:10万预算如何做不亏?
源码+样机定制项目成本拆解:10万预算如何做不亏?

前阵子接了个咨询,客户要做一套带硬件底座的智能设备,要求交付完整的源码加样机,对方预算卡在10万元。我帮他算了半天账,最后发现这事儿的利润空间远没有想象中那么乐观,但也不是完全没得做。今天把整个核算过程摊开来… · 2026/9/27 10:56:40

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码