HarmonyOS NEXT开发之ArkTS自定义组件学习笔记

ops/2024/10/21 19:59:25/

在HarmonyOS中,ArkTS提供了创建自定义组件的能力,允许开发者封装和复用UI代码。以下是关于自定义组件的详细介绍,包括创建自定义组件、页面和自定义组件的生命周期、自定义组件的自定义布局、冻结功能,以及代码案例分析。

创建自定义组件

自定义组件是基于struct实现的,使用@Component装饰器来标识。每个自定义组件都必须实现build()方法,用于描述组件的UI结构。

@Component
struct HelloComponent {@State message: string = 'Hello, World!';build() {Row() {Text(this.message).onClick(() => {this.message = 'Hello, ArkUI!';})}}
}

在其他文件中使用该自定义组件时,需要使用export关键字导出,并在页面中使用import导入该组件 。

页面和自定义组件生命周期

页面生命周期仅限于被@Entry装饰的组件,而自定义组件的生命周期仅限于被@Component装饰的组件。

  • onPageShow:页面每次显示时触发。
  • onPageHide:页面每次隐藏时触发。
  • onBackPress:当用户点击返回按钮时触发。
  • aboutToAppear:组件即将出现时触发。
  • aboutToDisappear:组件即将销毁时触发 。

自定义组件的自定义布局

如果需要通过测算的方式布局自定义组件内子组件的位置,可以使用onMeasureSizeonPlaceChildren接口。

@Component
struct CustomLayout {@Builder doNothingBuilder() {};@BuilderParam builder: () => void = this.doNothingBuilder;@State startSize: number = 100;result: SizeResult = { width: 0, height: 0 };onMeasureSize(selfLayoutInfo: GeometryInfo, children: Array<Measurable>, constraint: ConstraintSizeOptions) {let size = 100;children.forEach((child) => {let result: MeasureResult = child.measure({ minHeight: size, minWidth: size, maxWidth: size, maxHeight: size });size += result.width / 2;});this.result.width = 100;this.result.height = 400;return this.result;}onPlaceChildren(selfLayoutInfo: GeometryInfo, children: Array<Layoutable>, constraint: ConstraintSizeOptions) {let startPos = 300;children.forEach((child) => {let pos = startPos - child.measureResult.height;child.layout({ x: pos, y: pos });});}build() {this.builder();}
}

在这个例子中,CustomLayout组件通过onMeasureSizeonPlaceChildren设置了子组件的大小和位置 。

自定义组件冻结功能

从API version 12开始,@ComponentV2装饰的自定义组件支持冻结功能。当组件处于非激活状态时,状态变量将不响应更新。

@Entry@ComponentV2({ freezeWhenInactive: true })
struct FirstTest {build() {Column() {Text(`From first Page ${book.page}`).fontSize(50)Button('first page + 1').fontSize(30).onClick(() => {book.page += 1;})Button('go to next page').fontSize(30).onClick(() => {router.pushUrl({ url: 'pages/Page' });})}}
}

在这个例子中,当页面A跳转到页面B时,页面A的状态变为非激活,组件的更新将被冻结 。

通过这些功能,开发者可以创建可复用、响应式且具有复杂布局的自定义组件,从而提升HarmonyOS应用的开发效率和用户体验。

自定义组件案例:订单列表页面

假设我们需要开发一个HarmonyOS应用,其中包含一个订单列表页面。这个页面将显示一个订单项的自定义组件,每个订单项包含订单编号、日期和订单状态。我们希望这个自定义组件是可重用的,以便在应用的其他部分也可以使用它。

步骤 1: 创建自定义组件

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

// OrderItem.ets
@Component
export struct OrderItem {@Prop orderId: string;@Prop orderDate: string;@Prop status: string;build() {Row() {Text(this.orderId).width(200).height(60).fontSize(16).alignItems(HorizontalAlign.Start);Text(this.orderDate).width(150).height(60).fontSize(14).alignItems(HorizontalAlign.Center);Text(this.status).width(100).height(60).fontSize(14).alignItems(HorizontalAlign.End);}.padding(10).backgroundColor(Color.White).border({ width: 1, color: Color.Grey });}
}

在这个组件中,我们使用了@Prop装饰器来定义属性,这些属性将由父组件传递。build()方法定义了订单项的UI结构,使用了Row布局来水平排列订单编号、日期和状态。

步骤 2: 使用自定义组件

接下来,我们在订单列表页面中使用OrderItem组件来显示订单数据。

// OrderList.ets
import { OrderItem } from './OrderItem';@Entry
@Component
struct OrderList {@State orders: Array<{ orderId: string; orderDate: string; status: string }> = [{ orderId: '001', orderDate: '2024-04-01', status: 'Completed' },{ orderId: '002', orderDate: '2024-04-02', status: 'Shipped' },// 更多订单...];build() {Column() {ForEach(this.orders, (order) => {OrderItem({orderId: order.orderId,orderDate: order.orderDate,status: order.status,});});}.spacing(10).padding(10);}
}

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

详细解释

  1. 自定义组件的定义OrderItem组件通过@Component装饰器定义,使其成为一个自定义组件。它接受三个属性:orderIdorderDatestatus

  2. UI布局:在OrderItembuild()方法中,我们使用Row布局来水平排列三个Text组件,分别显示订单编号、日期和状态。每个Text组件都设置了宽度、高度、字体大小和对齐方式,以确保布局的整洁和一致性。

  3. 属性传递OrderItem组件的属性是通过@Prop装饰器定义的,这允许父组件OrderList在创建OrderItem实例时传递这些属性的值。

  4. 数据驱动OrderList组件的状态变量orders包含了订单数据。使用ForEach循环,我们为每个订单项创建一个OrderItem组件实例,并将订单数据作为属性传递给它。

  5. 重用性OrderItem组件是可重用的,因为它封装了订单项的UI和逻辑,可以在OrderList页面之外的其他部分使用,只需传递相应的属性即可。

好了,这个案例展示了如何创建和使用自定义组件来构建HarmonyOS应用的UI,以及如何通过属性传递和状态管理来实现数据驱动的UI更新。关注威哥爱编程,你会发现他的世界里,咖啡是燃料,键盘是乐器,而代码就是他的交响乐。每当夜深人静,别人数羊,威哥数的是代码行数。🌙👨‍💻🎶


http://www.ppmy.cn/ops/127358.html

相关文章

全面升级产品矩阵,智象未来(HiDream.ai)赋能创作与营销新高度

在这个数字内容创作与品牌营销飞速发展的新时代&#xff0c;创新与变革已经成为推动整个行业向前发展的关键力量。智象未来&#xff08;HiDream.ai&#xff09;凭借敏锐的市场洞察力&#xff0c;捕捉到了创作者在这样一个多变环境中的真实需求。为了更好地服务创作者&#xff0…

QEMU入门1:ubuntu22.04搭建QEMU运行环境

文章目录 前言I 系统配置配置网络配ip配网关(有需要才配)配DNS 配置系统服务配sshd改镜像源 II 搭建qemu8.1.5运行环境安装通用编译工具安装python下载qemu初次编译qemu安装qemu编译依赖pip下载超时解决git下载不了解决安装qemu需要的python包安装qemu需要的apt包 III 搭建aarc…

python的特殊方法 str

特殊方法 str """ 特殊方法 __str____str__ 方法用于返回字符串形式&#xff0c;通常用于输出对象时使用这个方法返回的是一个字符串&#xff0c;用于描述对象的状态或者内容重写 __str__ 方法&#xff0c;可以用于定义输出对象的内容&#xff0c;使输出的内容…

docker如何建立本地私有仓库,并将docker镜像推到私有仓库

在 Docker 中&#xff0c;您可以通过 Docker Registry 创建本地私有仓库&#xff0c;并将 Docker 镜像推送到这个私有仓库。以下是具体步骤&#xff1a; 步骤 1&#xff1a;启动一个本地 Docker 私有仓库 拉取 registry 镜像&#xff1a; Docker 官方提供了一个 registry 镜像…

Web APIs - 第2天笔记(黑马笔记)

目录 Web APIs - 第2天 事件 事件监听 事件类型 事件处理程序 事件类型 鼠标事件 键盘事件 焦点事件 文本框输入事件 事件对象 环境对象 回调函数 Web APIs - 第2天 学会通过为DOM注册事件来实现可交互的网页特效。 能够判断函数运行的环境并确字 this 所指代的对象…

使用Spring Boot打造中小型医院网站

1 绪论 1.1研究背景 随着计算机技术的成熟、普及&#xff0c;现代信息技术革命的迅猛发展,正冲击并进而改变着经济和社会结构。信息化的程度已经成为一个国家&#xff0c;一个企业&#xff0c;一个组织仍至一个人发展的基础和竞争成败的关键。 在实际的生活中&#xff0c;用户都…

shell脚本实现批量请求

目录&#xff1a; 1、上脚本代码2、脚本解析3、执行脚本命令 1、上脚本代码 上述脚本使用循环来调用接口并记录每次接口的响应时间来定位接口的响应性能是否符合预期。 2、脚本解析 官方脚本介绍网址&#xff1a; https://www.w3cschool.cn/linux/linux-shell-passing-argume…

Android 第5种启动模式:singleInstancePerTask

Android 第5种启动模式&#xff1a;singleInstancePerTask 随着 Android 版本的更新&#xff0c;应用启动模式逐渐丰富。在 Android 12 中&#xff0c;新增了一种启动模式——singleInstancePerTask。它是继 standard、singleTop、singleTask 和 singleInstance 之后的第五种启…