当前位置: 首页 > news >正文

HarmonyOS 小游戏《对战五子棋》开发第34篇 - ArkTS中复用UI的方法

把重复的UI代码提取成方法——@Builder是ArkUI的"组件函数"

什么是@Builder

@Builder是ArkTS的装饰器,用于定义可复用的UI构建方法。它类似于"轻量级组件"——不需要声明struct,但可以包含完整的UI代码。

本项目的@Builder使用

AIBattlePage使用了4个@Builder方法:

@BuilderlevelSelectView(){/* 关卡选择视图 */}@BuilderlevelCard(item:LevelConfig){/* 关卡卡片 */}@BuildergameView(){/* 游戏对战视图 */}@BuilderresultDialog(){/* 结果弹窗 */}

@Builder的调用

build(){Stack(){Column(){// 导航栏...if(this.inGame){this.gameView()// 调用@Builder方法}else{this.levelSelectView()// 调用@Builder方法}}if(this.inGame&&this.showResultDialog){this.resultDialog()// 调用@Builder方法}}}

@Builder方法可以用this.xxx()在build()中调用,就像普通方法一样。

@Builder vs 自定义组件

特性@Builder@Component struct
声明方式方法struct
参数传递方法参数@Prop/@Link
状态管理共享宿主组件状态独立状态
复用性仅限当前组件跨文件复用
适合场景组件内UI拆分独立可复用组件

为什么AIBattlePage用@Builder

AIBattlePage有两个主要视图(选关、游戏)和一个弹窗,如果全部写在build()中会非常冗长。用@Builder拆分后:

build(){Stack(){Column(){// 导航栏(共用)Row(){...}// 根据状态选择视图if(this.inGame){this.gameView()// 100+行UI代码被封装}else{this.levelSelectView()// 50+行UI代码被封装}}if(this.inGame&&this.showResultDialog){this.resultDialog()// 80+行UI代码被封装}}}

build()方法变得简洁清晰。

@Builder方法内部访问状态

@BuildergameView(){Column(){// 直接访问宿主组件的@StateText(this.getStatusText())if(this.aiThinking){LoadingProgress()}ChessBoardView({boardData:this.boardData,onCellClick:(row:number,col:number)=>{this.onCellClick(row,col);}})}}

@Builder方法可以直接访问宿主组件的所有成员变量和方法——不需要参数传递。

@Builder带参数

@BuilderlevelCard(item:LevelConfig){Button(){Row({space:16}){Text(item.icon).backgroundColor(item.color)Column(){Text(`${item.level}`)Text(item.name)Text(item.desc)}}}.enabled(item.level<=this.unlockedLevel)// 仍可访问宿主状态}

参数item是LevelConfig类型,在ForEach中传入:

ForEach(this.levels,(item:LevelConfig)=>{this.levelCard(item)// 传参调用},(item:LevelConfig)=>item.level.toString())

@Builder的嵌套调用

@BuilderlevelSelectView(){Column({space:16}){Text('选择关卡')ForEach(this.levels,(item:LevelConfig)=>{this.levelCard(item)// @Builder调用@Builder},(item:LevelConfig)=>item.level.toString())}}

@Builder方法可以调用其他@Builder方法——形成UI的模块化组合。

ChessBoardView为什么不用@Builder

ChessBoardView是独立组件(@Component export struct),不是@Builder——因为它需要跨文件复用(被TwoPlayerPage和AIBattlePage共用)。

选择原则

  • 仅在当前组件内使用的UI片段 → @Builder
  • 需要跨组件/跨文件复用 → @Component struct

总结

@Builder是ArkUI中组织UI代码的重要工具:

  1. 代码拆分:将冗长的build()方法分解为逻辑单元
  2. 状态共享:直接访问宿主组件的状态
  3. 参数传递:支持方法参数
  4. 嵌套调用:@Builder可以调用@Builder
  5. 适用场景:组件内的UI复用,不需要跨文件

合理使用@Builder可以让复杂的UI代码保持清晰和可维护。

http://www.jsqmd.com/news/1172254/

相关文章:

  • Python量化交易入门:从零搭建策略回测与实盘系统
  • Squid 访问控制 ACL 配置详解:基于 5 种规则实现精细化上网管控
  • Npcap 1.88 安装失败排查:虚拟网卡驱动冲突的 3 步修复方案
  • 2026年7月最新泉州雷达官方售后维修服务网点地址与客服电话 - 亨得利钟表维修中心
  • Unity字体优化实战:动态子集生成与AssetBundle打包避坑指南
  • Beyond Compare 4 远程对比实战:3步配置SFTP连接,实现本地与服务器文件同步
  • Unity物理布料模拟实战:Magica Cloth 2从入门到避坑指南
  • 状态管理失效?任务超时?异常漂移?AI Agent工作流稳定性攻坚全解析,深度解读LLM+Reasoning+Tool三阶协同机制
  • VS Code Java 项目创建:3种构建工具(Maven/Gradle/None)实战对比
  • Krea 2身份保留功能实战:基于LoRA的人物特征稳定生成指南
  • Web开发底层逻辑:MVT架构与URL路由解析
  • 校园网 IP 地址配置实战:DHCP 与静态 IP 的 3 种场景与 5 步排查法
  • 跨平台Crypto++构建终极指南:Windows/Linux/macOS一键编译与部署
  • Keil MDK 5.39 编码与重复定义:2类编译错误的根因分析与3步修复流程
  • 多维聚合实战:从Pandas透视表到数据立方体构建
  • OpenAI API 集成实战:从环境配置到生产部署的完整指南
  • 2026年7月最新广州雅典官方售后服务热线与网点地址查询 - 亨得利官方服务中心
  • 勒索软件解密工具盘点:10 款主流工具适用场景与实战恢复指南
  • Godot游戏开发实战:从零搭建专业级开始界面与场景切换
  • 云原生应用故障管理:基于SLO的MTTR优化与5分钟恢复实践
  • Stm32_SysTick系统定时器
  • 生产级多维聚合:滚动窗口、自定义函数与unstack实战
  • [SHOI2011] 扫雷机器人 题解
  • Leaflet 离线地图性能优化:3 种瓦片存储方案对比与百兆数据加载实测
  • Hadoop 3.3.4 MapReduce 实战:3步实现倒排索引,输出文件1@频次格式
  • OpenSSL 与 ssh-keygen 密钥格式互转:3 种场景下的完整命令与验证
  • 【Copilot×CI/CD黄金组合】:2024 Q2 Gartner DevOps成熟度评估新增“AI协同指数”,你团队达标了吗?
  • Android 3D游戏开发入门:从OpenGL ES基础到实战渲染与优化
  • Flink 2.3 状态后端实战:RocksDB vs HashMap 在10亿事件/天场景下的配置与调优
  • VS Code 插件深度评测:3款 TypeScript 智能辅助工具(Hero vs Importer vs Sorter)对比