HarmonyOS NEXT开发 ArkTS自定义组件

news/2024/10/18 10:06:50/

摘要

在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装饰的组件。

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

自定义组件的自定义布局

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

@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装饰器定义,使其成为一个自定义组件。它接受三个属性:orderId、orderDate和status。
2.UI布局:在OrderItem的build()方法中,我们使用Row布局来水平排列三个Text组件,分别显示订单编号、日期和状态。每个Text组件都设置了宽度、高度、字体大小和对齐方式,以确保布局的整洁和一致性。
3.属性传递:OrderItem组件的属性是通过@Prop装饰器定义的,这允许父组件OrderList在创建OrderItem实例时传递这些属性的值。
4.数据驱动:OrderList组件的状态变量orders包含了订单数据。使用ForEach循环,我们为每个订单项创建一个OrderItem组件实例,并将订单数据作为属性传递给它。
5.重用性:OrderItem组件是可重用的,因为它封装了订单项的UI和逻辑,可以在OrderList页面之外的其他部分使用,只需传递相应的属性即可。


http://www.ppmy.cn/news/1539967.html

相关文章

Linux内核 -- IPI 中断的作用与用法

Linux IPI 中断的作用与用法 1. IPI0 的作用与用法 在 Linux 系统中&#xff0c;IPI&#xff08;Inter-Processor Interrupt&#xff09;是一种用于多核处理器之间通信的中断&#xff0c;常用于多核系统中的同步和协调操作。IPI0 是其中一种常见的 IPI&#xff0c;其作用和用…

zynq 的 sdk 库重新加载硬件程序后 lwip库找不到的处理方法

ps 的工程名-&#xff1e;c/c build setting -&#xff1e;software platform-&#xff1e;添加-llwip4 即可

《深度学习》Dlib、OpenCV 关键点定位 原理及案例解析

目录 一、关键点定位 1、什么是关键点定位 2、步骤 1&#xff09;加载预训练的人脸检测器 2&#xff09;加载预训练的关键点检测器 3&#xff09;读取图像 4&#xff09;检测人脸 5&#xff09;关键点检测 6&#xff09;可视化关键点 7&#xff09;显示图像 二、案例…

LINUX (s-nail)定时发邮件

作业要求 在linux主机通过定时任务指定在每天12:12分定时发送邮件&#xff1b;邮件内容自定。 ssh 192.168.169.128 [rootlocalhost ~]# mount /dev/sr0 /mnt [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [BaseOS] nameBaseOS baseurlfile:///mnt/BaseOS gpgcheck0 […

DNS:互联网域名系统的核心

什么是 DNS&#xff1f; DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;是互联网的一项基础服务&#xff0c;它负责将人类容易记忆的域名&#xff08;如 www.example.com&#xff09;转换成计算机可以识别的 IP 地址&#xff08;如 192.0.2.1&#xff09…

Flume面试整理-配置文件格式

Apache Flume的配置文件采用简单的文本格式来定义和配置Source(源)、Channel(通道)和Sink(汇),以实现数据流的管理。配置文件通常以.conf为扩展名,每个配置文件定义一个或多个Flume Agent的属性和行为。以下是Flume配置文件格式的详细介绍: Flume配置文件的基本结构 一…

WPF 学习:知识要点、学习资源推荐

一、引言 在当今数字化时代&#xff0c;Windows 桌面应用程序的开发依旧占据着重要地位。Windows Presentation Foundation&#xff08;WPF&#xff09;作为微软精心打造的用于构建 Windows 桌面应用程序的强大框架&#xff0c;为开发者开辟了一片充满创意与可能性的天地。它融…

人工智能学习框架

1. 基础知识 1.1 数学基础&#xff08;细化&#xff09; 1.1.1 线性代数 向量与矩阵 &#xff1a; 向量&#xff1a;如 x(x1,x2,…,xn)\mathbf{x} (x_1, x_2, …, x_n)x(x1,x2,…,xn) 是一维的数值数组&#xff0c;表示空间中的点或方向。矩阵&#xff1a;二维数值表&#x…