HarmonyOS7 动态菜单构建器:用 ForEach 做好动态操作
文章目录前言先看这个案例解决什么状态为什么这样设计关键代码拆开看完整代码落地时我会怎么改前言这组案例开始进入选择类和调节类组件写业务页面时会经常遇到。这个案例围绕动态菜单项渲染展开重点不是把属性背下来而是弄清楚状态、组件和用户操作之间怎么连起来。这里更适合从数据驱动角度看。数组变化之后ForEach负责把选项渲染出来。先看这个案例解决什么如果把它放到真实项目里常见位置可能是设置页、筛选页、编辑页或者某个需要快速操作的工具面板。用户点一下、选一下、拖一下页面就应该给出明确反馈。维度内容案例主题动态菜单项渲染核心 APIForEach使用场景动态操作文章侧重点数据驱动状态为什么这样设计代码结构可以按三层读外层负责页面背景和留白中间卡片承载主要内容内部组件处理具体交互。这样的层级不花哨但维护起来比较舒服。我比较推荐先把状态字段命名清楚。选中项、开关状态、滑块数值最好都能从名字看出用途比随手写flag、value后面省心很多。关键代码拆开看先看一段连续代码基本能判断这个案例的运行方式。它包含入口组件、状态字段以及一部分核心 UI。interfaceMenuItemConf{title:stringaction:string}EntryComponentstruct DynamicMenuBuilder{StateisShow:booleantrueStateisMenuOpen:booleanfalseStatemenuMode:number0StatelastAction:stringprivatefileMenu:MenuItemConf[][{title:新建,action:新建文件},{title:打开,action:打开文件},{title:保存,action:保存文件}]privateeditMenu:MenuItemConf[][{title:复制,action:复制内容},{title:粘贴,action:粘贴内容},{title:剪切,action:剪切内容}]privateviewMenu:MenuItemConf[][{title:放大,action:放大视图},{title:缩小,action:缩小视图},{title:还原,action:还原大小}]getCurrentMenu():MenuItemConf[]{if(this.menuMode0)returnthis.fileMenu这段代码可以拆成几块看State保存当前页面状态用户操作之后会触发 UI 更新。ForEach是案例的关键入口真正的行为通常由它和事件回调一起完成。布局属性服务于业务表达选中、禁用、拖动这些状态最好都能在视觉上看出来。完整代码下面是整理后的完整代码。组件名已经改成DynamicMenuBuilder共享颜色也内置到当前文件里单独复制出来读会更方便。constPAGE_BG_COLOR:string#F5F6FAconstCARD_BG_COLOR:string#FFFFFFconstTHEME_COLOR:string#4D96FFconstSUBTEXT_COLOR:string#8A8A8AinterfaceMenuItemConf{title:stringaction:string}EntryComponentstruct DynamicMenuBuilder{StateisShow:booleantrueStateisMenuOpen:booleanfalseStatemenuMode:number0StatelastAction:stringprivatefileMenu:MenuItemConf[][{title:新建,action:新建文件},{title:打开,action:打开文件},{title:保存,action:保存文件}]privateeditMenu:MenuItemConf[][{title:复制,action:复制内容},{title:粘贴,action:粘贴内容},{title:剪切,action:剪切内容}]privateviewMenu:MenuItemConf[][{title:放大,action:放大视图},{title:缩小,action:缩小视图},{title:还原,action:还原大小}]getCurrentMenu():MenuItemConf[]{if(this.menuMode0)returnthis.fileMenuif(this.menuMode1)returnthis.editMenureturnthis.viewMenu}getModeLabel():string{if(this.menuMode0)return文件菜单if(this.menuMode1)return编辑菜单return视图菜单}BuilderDynamicMenu(){Menu(){ForEach(this.getCurrentMenu(),(item:MenuItemConf){MenuItem({content:item.title}).onClick((){this.lastActionitem.action})})}}build(){Column(){if(this.isShow){Column({space:14}){Text(动态切换菜单).fontSize(14).fontColor(THEME_COLOR).fontWeight(600)Row({space:8}){Button(文件).fontSize(13).fontColor(this.menuMode0?#FFFFFF:#666666).backgroundColor(this.menuMode0?THEME_COLOR:#F0F0F0).borderRadius(6).height(34).padding({left:14,right:14}).onClick((){this.menuMode0})Button(编辑).fontSize(13).fontColor(this.menuMode1?#FFFFFF:#666666).backgroundColor(this.menuMode1?#FF6B6B:#F0F0F0).borderRadius(6).height(34).padding({left:14,right:14}).onClick((){this.menuMode1})Button(视图).fontSize(13).fontColor(this.menuMode2?#FFFFFF:#666666).backgroundColor(this.menuMode2?#6BCB77:#F0F0F0).borderRadius(6).height(34).padding({left:14,right:14}).onClick((){this.menuMode2})}Button(打开${this.getModeLabel()}).fontSize(15).fontColor(#FFFFFF).backgroundColor(#4D96FF).borderRadius(8).width(60%).height(44).onClick((){this.isMenuOpentrue}).bindMenu(this.isMenuOpen,this.DynamicMenu,{onDisappear:(){this.isMenuOpenfalse}})Text(this.lastAction||切换上方标签菜单会动态变化).fontSize(13).fontColor(this.lastAction?#333333:SUBTEXT_COLOR)}.width(100%).alignItems(HorizontalAlign.Center).padding(16).backgroundColor(CARD_BG_COLOR).borderRadius(12)}Text(动态菜单构建器Menu 动态菜单State 驱动菜单项变化).fontSize(12).fontColor(SUBTEXT_COLOR).margin({top:12})}.width(100%).height(100%).backgroundColor(PAGE_BG_COLOR).padding(16)}}落地时我会怎么改继续扩展的话我会把静态选项抽成接口返回的数据再补上空状态和异常状态。示例页面先把核心交互跑通就够了到了业务页面状态边界才是真正容易出问题的地方。

相关新闻

Slug API接口详解:开发者如何集成和使用Slug的API

Slug API接口详解:开发者如何集成和使用Slug的API

Slug API接口详解:开发者如何集成和使用Slug的API 【免费下载链接】slug 🌱 An open-source URL shortener built with T3 Stack. 项目地址: https://gitcode.com/gh_mirrors/slug/slug Slug是一款基于T3 Stack构建的开源URL短链服务,…

2026/7/19 17:41:39阅读更多 →
Nemo Skills指令遵循评估:IFBench、IFEval等指令理解基准测试

Nemo Skills指令遵循评估:IFBench、IFEval等指令理解基准测试

Nemo Skills指令遵循评估:IFBench、IFEval等指令理解基准测试 【免费下载链接】Skills A project to improve skills of large language models 项目地址: https://gitcode.com/gh_mirrors/ne/Skills Nemo Skills是一个专注于提升大型语言模型(LL…

2026/7/19 17:41:39阅读更多 →
Apache Commons Collections 实战案例:电商系统库存管理的集合应用

Apache Commons Collections 实战案例:电商系统库存管理的集合应用

Apache Commons Collections 实战案例:电商系统库存管理的集合应用 【免费下载链接】commons-collections Apache Commons Collections 项目地址: https://gitcode.com/gh_mirrors/com/commons-collections Apache Commons Collections 是Java开发者必备的工…

2026/7/19 17:41:39阅读更多 →
ngx_output_chain_get_buf

ngx_output_chain_get_buf

1 定义 ngx_output_chain_get_buf 函数 定义在 src/core/ngx_output_chain.cstatic ngx_int_t ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, off_t bsize) {size_t size;ngx_buf_t *b, *in;ngx_uint_t recycled;in ctx->in->buf;size ctx->buf…

2026/7/20 0:15:05阅读更多 →
互联网大厂常见Java面试题及答案汇总(2026持续更新)

互联网大厂常见Java面试题及答案汇总(2026持续更新)

金九银十即将来袭,又是一个跳槽的好季节,准备跳槽的同学都摩拳擦掌准备大面好几场,今天为大家准备了互联网面试必备的 1 到 5 年 Java 面试者都需要掌握的面试题,分别 JVM,并发编程,MySQL,Tomca…

2026/7/20 0:15:05阅读更多 →
python数据可视化技巧的100个练习 -- 31. 类别数据的点图

python数据可视化技巧的100个练习 -- 31. 类别数据的点图

重要性★★★☆☆ 难度★★☆☆☆ 你是一家零售公司的数据分析师。你的经理要求你可视化最近产品发布的客户满意度评级分布。评级是分类的,范围从“非常不满意”到“非常满意”。创建一个点图以显示每个评级类别的频率。使用 Python 进行数据处理和可视化。在代码中生成输入…

2026/7/20 0:13:05阅读更多 →
智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

在2026世界人工智能大会(WAIC 2026)举办期间,千里科技董事长、阶跃星辰董事长印奇作为特邀嘉宾出席大会开幕式并在大会主论坛(上午场)发表主题演讲《当智能体进入物理世界》。在印奇看来,"智能体"…

2026/7/20 0:13:05阅读更多 →
商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

7月18日,在WAIC 2026商汤科技 “基座大模型架构创新与生态合作论坛”上,商汤科技联合创始人、大装置事业群总裁杨帆发表《智变共生——加速AI基础设施持续升级》主题演讲,系统呈现了商汤大装置国产AI基础设施“技术-生态-商业”闭环布局&…

2026/7/20 0:13:05阅读更多 →
2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026年想在郑州学美发,很多零基础学员最先搜索的问题就是:郑州美发学校哪家好?这个问题没有一个只看学校名字就能得出的答案。因为不同学校的课程方向、学习周期、教学方式和适合人群并不一样。有的更适合零基础,有的偏向发型师进修,还有的只做某一项短期技术培训。对于完全没…

2026/7/20 0:11:05阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/20 0:50:54阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/20 0:50:54阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/20 0:50:54阅读更多 →
2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

7月18日智东西消息,在2026 WAIC期间,努比亚联合字节豆包打造的二代“豆包手机”努比亚NaviX Ultra首次亮相,相比一代有诸多升级。智能体手机理念中兴通讯终端事业部总裁、努比亚总裁倪飞表示,智能体手机要从人操作手机变为手机帮人…

2026/7/20 0:01:04阅读更多 →
努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra:外观与功能双升级在2026 WAIC期间,首次亮相的努比亚NaviX Ultra吸引了众多目光。它是努比亚联合字节豆包打造的二代“豆包手机”,与一代努比亚M153相比,外观设计变化较大。其机身背部搭载横向排布的大尺寸影像模…

2026/7/20 0:01:04阅读更多 →
C# 将逗号分割的字符串转换为long,并添加到List<long>

C# 将逗号分割的字符串转换为long,并添加到List<long>

目录 方法1:使用Split和Convert.ToInt64 方法2:使用LINQ的Select和ToList 方法3:使用TryParse进行异常安全转换(推荐) 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天…

2026/7/20 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/19 22:50:49阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/19 18:50:36阅读更多 →