如何在 HarmonyOS NEXT 中使用 @Builder 装饰器优化 UI 组件的复用?

摘要

在鸿蒙 NEXT 开发中,@Builder 装饰器是一种轻量级的 UI 元素复用机制,它允许开发者将重复使用的 UI 元素抽象成一个方法,并在 build() 方法中多次调用,以实现 UI 结构的复用。以下是如何使用 @Builder 装饰器来优化 UI 组件复用的详细介绍和案例分析:

自定义构建函数

@Builder 方法可以定义在组件内或全局,用于封装可复用的 UI 结构。在组件内定义的 @Builder 方法可以通过 this 访问当前组件的属性和方法,而全局的 @Builder 方法则不能访问组件内部的属性和方法。

组件内 @Builder 方法:

@Entry
@Component
struct BuilderPage {build() {Column() {Row({ space: 50 }) {// 复用 UI 结构this.compButtonBuilder($r('app.media.icon_edit'), '编辑', () => console.log('编辑'));this.compButtonBuilder($r('app.media.icon_send'), '发送', () => console.log('发送'));}}.width('100%').height('100%').justifyContent(FlexAlign.Center);}// 定义 UI 结构@Builder compButtonBuilder(icon: Resource, text: string, callback: () => void) {Button() {Row({ space: 10 }) {Image(icon).width(25).height(25);Text(text).fontColor(Color.White).fontSize(25);}}.width(120).height(50).onClick(callback);}
}

全局 @Builder 方法:

@Builder function globalButtonBuilder(icon: Resource, text: string, callback: () => void) {Button() {Row({ space: 10 }) {Image(icon).width(25).height(25);Text(text).fontColor(Color.White).fontSize(25);}}.width(120).height(50).onClick(callback);
}@Entry
@Component
struct BuilderPage {build() {Column() {Row({ space: 50 }) {// 复用 UI 结构globalButtonBuilder($r('app.media.icon_edit'), '编辑', () => console.log('编辑'));globalButtonBuilder($r('app.media.icon_send'), '发送', () => console.log('发送'));}}.width('100%').height('100%').justifyContent(FlexAlign.Center);}
}

参数传递规则

@Builder 方法具有两种参数传递机制——按值传递和按引用传递。当只有一个参数且参数为对象字面量时为按引用传递,其余情况均为按值传递。按引用传递时,若传递的参数为状态变量,则状态变量的变化会触发 @Builder 方法内部 UI 的刷新;按值传递时则不会。

@BuilderParam 装饰器

@BuilderParam 装饰器用于装饰自定义组件中的属性,使其可以作为 UI 结构的占位符。在创建组件时,可以通过参数为其传入具体的内容,类似于 Vue 框架中的 slot。

@Component
struct Container {@BuilderParam content: () => voidbuild() {Column() {Text('你好,我是V哥');this.content(); // 占位符Button('点我一下试试');}}
}

@Builder 在购物车显示多个商品项的使用

让我们考虑一个电商应用中的购物车页面,这个页面需要显示多个商品项,每个商品项包括商品图片、名称、价格和数量选择器。我们希望商品项的UI是一致的,但每个商品项的具体内容(图片、名称、价格、数量)可能不同。这是一个典型的使用自定义组件的场景,我们可以通过@Builder装饰器来实现这一点。

步骤 1: 创建自定义组件

首先,我们创建一个名为CartItem的自定义组件,它将显示单个商品项的详细信息。

// CartItem.ets
@Component
struct CartItem {@Prop商品图片: Resource;@Prop商品名称: string;@Prop商品价格: string;@Prop商品数量: number;build() {Row() {Image(this.商品图片).width(50).height(50);Column() {Text(this.商品名称).fontSize(16);Text(this.商品价格).fontSize(14).fontColor(Color.Red);}Stepper() {Text(this.商品数量.toString())}.min(1).max(10)}.padding(10).border({ width: 1, color: Color.Grey })}
}

在这个组件中,我们使用了@Prop装饰器来定义属性,这些属性将由父组件传递。build()方法定义了商品项的UI结构。

步骤 2: 使用自定义组件

接下来,在购物车页面中使用CartItem组件来显示商品数据。

// CartPage.ets
@Entry
@Component
struct CartPage {@State商品列表: Array<{商品图片: Resource;商品名称: string;商品价格: string;商品数量: number;}> = [{商品图片: $r('app.media.product1'),商品名称: '商品名称1',商品价格: '¥100',商品数量: 1,},// 更多商品...];build() {Column() {ForEach(this.商品列表, (item) => {CartItem({商品图片: item.商品图片,商品名称: item.商品名称,商品价格: item.商品价格,商品数量: item.商品数量,})})}.padding(10)}
}

在CartPage组件中,我们定义了一个状态变量商品列表来存储商品数据。在build()方法中,我们使用ForEach循环来遍历商品数组,并为每个商品创建一个CartItem组件实例,传递相应的属性。

通过这个案例,我们可以看到如何使用自定义组件和@Builder装饰器来构建一个具有一致UI结构的电商应用购物车页面,同时保持代码的简洁性和可维护性。

总结

使用 @Builder 装饰器可以有效地复用 UI 结构,减少代码冗余,并提高开发效率。全局 @Builder 方法适用于整个应用中可复用的 UI 结构,而组件内的 @Builder 方法适用于特定组件内的复用。通过合理使用 @Builder 和 @BuilderParam 装饰器,开发者可以构建更加模块化和可维护的鸿蒙应用 UI 组件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/56381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ovis: 多模态大语言模型的结构化嵌入对齐

论文题目&#xff1a;Ovis: Structural Embedding Alignment for Multimodal Large Language Model 论文地址&#xff1a;https://arxiv.org/pdf/2405.20797 github地址&#xff1a;https://github.com/AIDC-AI/Ovis/?tabreadme-ov-file 今天&#xff0c;我将分享一项重要的研…

关于使用 C# 处理水位数据多种格式的统一转换

关于使用 C# 处理水位数据多种格式的统一转换 1、前言2、水位数据的多种格式3、水位数据多种格式的统一转换程序展示4、水位数据多种格式的统一转换 C# 代码4.1、声明引用命名空间4.2、多种格式的统一转换 C# 代码4.3、多种格式的统一转换 C# 代码&#xff0c;文件输出保存 1、…

Django进一步掌握(10月22日)

一、请求响应对象 请求对象request 响应对象HttpResponse 二、HttpResponse常用属性 status设置HTTP响应状态码 status_code查询HTTP响应状态码 content_type设置响应的类型 write()写入响应内容 三、重定向 1、实现URl访问的重定向 &#xff08;1&#xff09;使用Ht…

【尊享面试100题】数组/字符串

多看优秀的代码 1.数组列表中的最大距离2.字符串的左右移3.相隔为1的编辑距离4.形成字符串的最短路径5.连接二进制表示可形成的最大数值 1.数组列表中的最大距离 给定 m 个数组&#xff0c;每个数组都已经按照升序排好序了。 现在你需要从两个不同的数组中选择两个整数&#…

微知-Lecroy力科的PCIe协议分析仪型号命名规则(PCIe代,金手指lanes数量)

文章目录 要点主要型号命名规则各代主要产品图片Summit M616 协议分析仪/训练器Summit T516 分析仪Summit T416 分析仪Summit T3-16分析仪Summit T28 分析仪 综述 要点 LeCroy(力科)成立于1964年&#xff0c;是一家专业生产示波器厂家。在美国纽约。一直把重点放在研制改善生产…

Hallo2 长视频和高分辨率的音频驱动的肖像图像动画 (数字人技术)

HALLO2: LONG-DURATION AND HIGH-RESOLUTION AUDIO-DRIVEN PORTRAIT IMAGE ANIMATION 论文&#xff1a;https://arxiv.org/abs/2410.07718 代码&#xff1a;https://github.com/fudan-generative-vision/hallo2 模型&#xff1a;https://huggingface.co/fudan-generative-ai/h…

TikTok营销实用技巧与数据分析工具:视频洞察

TikTok凭借其独特的机制和庞大的流量&#xff0c;成为了众多品牌和卖家对产品进行宣传推广的必要平台之一。要在TikTok上优化营销效果、提升推广效率&#xff0c;可以使用平台提供的重要工具——视频洞察&#xff08;Video Insights&#xff09;。 一、视频洞察功能与技巧 视频…

React Native 项目使用Expo模拟器运行iOS和Android

iOS没有连接设备&#xff1a; 确保你已经用 USB 线将你的 iOS 设备连接到了你的 Mac。 设备未信任&#xff1a; 如果你的设备是第一次连接到 Mac&#xff0c;可能需要在设备上信任这台计算机。通常&#xff0c;当你连接设备时&#xff0c;设备上会弹出一个对话框&#xff0c;…

线性回归(一)

线性回归 1.基本术语 ①特征&#xff1a;预测所依据的自变量称为特征或协变量 ②标签&#xff1a;试图预测的目标称为标签或目标 2.举个栗子 线性假设是指目标&#xff08;房屋价格&#xff09;可以表示为特征&#xff08;面积和房龄&#xff09;的加权和&#xff0c;如下面…

YOLOv11入门到入土使用教程(含结构图)

一、简介 YOLOv11是Ultralytics公司在之前的YOLO版本上推出的最新一代实时目标检测器&#xff0c;支持目标检测、追踪、实力分割、图像分类和姿态估计等任务。官方代码&#xff1a;ultralytics/ultralytics&#xff1a;ultralytics YOLO11 &#x1f680; (github.com)https://g…

解决跨域问题

跨域是浏览器受同源策略的限制&#xff0c;同源策略是浏览器为确保资源安全&#xff0c;而遵循的一种策略&#xff0c;该策略对访问资源进行了一些限制&#xff08;如发送 ajax 请求&#xff0c;操作 dom&#xff0c;读取 cookie&#xff09;。 最常见的影响就是发送 ajax 请求…

【微知】如何通过命令行在非串口界面触发sysrq的help信息?(echo h > /proc/sysrq-trigger)

背景 在服务器上&#xff0c;触发sysrq通常需要在串口执行sysrq热键&#xff0c;比如 ~相关的操作 如何通过在ssh界面触发sysrq触发一些操作&#xff1f; 命令 通过sysrq指定的/proc接口文件进行操作 echo h > /proc/sysrq-trigger dmesg #产看输出的帮助信息然后根据打…

Junit + Mockito保姆级集成测试实践

一、做好单测&#xff0c;慢即是快 对于单元测试的看法&#xff0c;业界同仁理解多有不同&#xff0c;尤其是在业务变化快速的互联网行业&#xff0c;通常的问题主要有&#xff0c;必须要做吗&#xff1f;做到多少合适&#xff1f;现在没做不也挺好的吗&#xff1f;甚至一些大…

MYSQL-SQL-01-DDL(Data Definition Language,数据定义语言)

DDL&#xff08;数据定义语言&#xff09; DDL&#xff08;Data Definition Language&#xff09;&#xff0c;数据定义语言&#xff0c;用来定义数据库对象(数据库&#xff0c;表&#xff0c;字段) 。 一、数据库操作 1、 查询mysql数据库管理系统的所有数据库 语法&#…

django(3)jinja2模版的使用

启动模版 安装jinja2 pip install jinja2 配置setting TEMPLATES中添加配置 {BACKEND: django.template.backends.jinja2.Jinja2,DIRS: [os.path.join(BASE_DIR,jinja2)], #模版在项目中的所在位置} template中各项的含义 这个配置项中模版自上而下加载&#xff0c;重名…

Spring Boot框架的电影评论系统设计与实现

3系统分析 3.1可行性分析 通过对本电影评论网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本电影评论网站采用SSM框架&#xff0c;JAVA作为开发语言&#…

基于单片机的智能小区门禁系统设计(论文+源码)

1总体架构 智能小区门禁系统以STM32单片机和WiFi技术为核心&#xff0c;STM32单片机作为主控单元&#xff0c;通过WiFi模块实现与手机APP的连接&#xff0c;构建整个门禁系统。系统硬件包括RFID模块、指纹识别模块、显示屏、按键以及继电器。通过RFID绑定IC卡、APP面部识别、指…

HarmonyOS鸿蒙分布式文件操作的时候权限问题

对于分布式文件跨设备操作的时候&#xff0c;一定记得设置文件等级权限&#xff0c;否则会出现各种不同的异常&#xff1a; setSecurityLabel 设置文件权限 代码&#xff1a; //设置文件权限securityLabel.setSecurityLabel(destUriPath, s1).then(() > {PhLog.info(Succee…

红队-安全见闻篇(下)

声明 学习视频来自B站UP主 泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 硬件设备(知道对应的硬件上对应的扫描器就性) 一、硬件设备…

PHP中‘BITWISE AND‘运算符和‘LOGICAL AND‘运算符的区别

在PHP中&#xff0c;BITWISE AND&#xff08;位与&#xff09;运算符和LOGICAL AND&#xff08;逻辑与&#xff09;运算符都用于执行与操作&#xff0c;但它们作用于不同的数据类型&#xff0c;并产生不同的结果。 BITWISE AND 运算符 定义&#xff1a; BITWISE AND运算符&am…