公职人员可以做公益网站吗,郑州企业网站优化服务哪家好,建筑工程公司注册要求,网站建设中药尽量使用图片本文转载自《#2023盲盒码# OpenHarmony组件复用示例》#xff0c;作者zhushangyuan_ 摘要#xff1a;在开发应用时#xff0c;有些场景下的自定义组件具有相同的组件布局结构#xff0c;仅有状态变量等承载数据的差异。这样的组件缓存起来#xff0c;需要使用到该组件时直… 本文转载自《#2023盲盒码# OpenHarmony组件复用示例》作者zhushangyuan_ 摘要在开发应用时有些场景下的自定义组件具有相同的组件布局结构仅有状态变量等承载数据的差异。这样的组件缓存起来需要使用到该组件时直接复用减少了创建和渲染的时间可以提高帧率和用户性能体验。本文会介绍开发OpenHarmony应用时如何使用组件复用能力。关键字OpenHarmony HarmonyOS 鸿蒙 ForEach LazyForEach 循环渲染 概述 在开发应用时有些场景下的自定义组件具有相同的组件布局结构仅有状态变量等承载数据的差异。这样的组件缓存起来需要使用到该组件时直接复用 减少重复创建和渲染的时间从而提高应用页面的加载速度和响应速度。在OpenHarmony应用开发时自定义组件被Reusable装饰器修饰时表示该自定义组件可以复用。在父自定义组件下创建的可复用组件从组件树上移除后会被加入父自定义组件的可复用节点缓存里。 在父自定义组件再次创建可复用组件时会通过更新可复用组件的方式从缓存快速创建可复用组件。这就是OpenHarmony的组件复用机制。本文会介绍开发OpenHarmony应用时如何使用组件复用能力。 环境准备 准备一个DevEco Studio使用真机或者Simulator模拟器来验证。更多关于DevEco Studio的信息请访问HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者。 组件复用接口 OpenHarmony SDK文件ets\component\common.d.ts的自定义组件的生命周期里定义了aboutToReuse方法如下 自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期这些回调函数是私有的在运行时由开发框架在特定的时间进行调用不能从应用程序中手动调用这些回调函数。 当一个可复用的自定义组件从复用缓存中重新加入到节点树时触发aboutToReuse生命周期回调并将组件的构造参数传递给aboutToReuse。aboutToReuse函数的参数是字典类型的键为组件的构造参数变量名称值为组件的构造参数实际取值。 该声明周期函数从API version 10开始该接口支持在ArkTS卡片中使用。 declare class CustomComponent extends CommonAttribute {
....../*** aboutToReuse Method** param { { [key: string]: unknown } } params - Custom component init params.* syscap SystemCapability.ArkUI.ArkUI.Full* crossplatform* since 10*/aboutToReuse?(params: { [key: string]: unknown }): void;
......
}开发实践 我们看下组件复用的实际使用案例。示例中会创建一个图片列表页面使用懒加载LazyForEach以及组件复用能力。 创建数据源 首先创建了一个业务对象类MyImage包含一个image_id图片编号和image_path图片路径。根据实际业务的不同会有差异此例仅用于演示。 然后创建一个数据源类ImageListDataSource并构造一个列表对象imageList。 可以看到构造了10000条记录。 在工程的/resources/images文件夹下有50张图片。 每条记录中包含一个编号从0到9999。 记录中还一个一个图片路径不同的记录编号不会重复图片路径可能重复。 至此数据源类创建完毕。 export class MyImage {image_id: stringimage_path: stringconstructor(image_id: string, image_path: string) {this.image_id image_idthis.image_path image_path}
}export class ImageListDataSource extends BasicDataSource {private imageList: MyImage[] []public constructor() {super()for (let i 0;i 10000; i) {let imageStr /resources/images/photo${(i % 50).toString()}.jpgthis.imageList.push(new MyImage(i.toString(), imageStr))}}public totalCount(): number {return this.imageList.length}public getData(index: number): MyImage {return this.imageList[index]}
......
}创建复用组件 创建好数据源类后我们再看下可复用组件的代码。 使用装饰器Reusable来标记一个组件是否属于可复用组件。 我们创建的可复用组件有一个状态变量State item构造该自定义组件时父组件会给子母件传递构造数据。 还需要实现组件复用声明周期回调函数aboutToReuse在这个函数里通过params把构造数据传递给可复用组件。 我们在函数aboutToReus里再单独加个一个打印函数用于在组件复用时输出一条日志记录。 需要注意的是正常情况下aboutToReuse函数里除了构造参数传值不要做任何耗时操作。 在可复用组件的build()方法里为每条记录渲染一行包含图片、图片编号和图片路径。 图片编号可以识别渲染的是哪一条数据用于验证组件复用了正确的组件。 Reusable
Component
struct MyListItem {State item: MyImage new MyImage(, )aboutToReuse(params) {this.item params.itemLogger.info(TAG, aboutToReuse-,item this.item.toString())}build() {Row({ space: 10 }) {Image(this.item.image_path).width(50).height(50).borderRadius(5).autoResize(false).syncLoad(true)Blank()Text(this.item.image_id).fontColor(Color.Black).fontSize(15)Blank()Text(this.item.image_path).fontColor(Color.Black).fontSize(15)}}
}入口组件 在我们的Ent */-·- 件里在List父组件里可以调用可复用组件MyListItem。通过{ item: item }完成父子组件参数传递。 reuseId参数是可选的用于标记可复用组件的复用类型。属性参数的注释如下 /*** Reuse id is used for identify the reuse type for each custom node.* * param { string } id - The id for reusable custom node.* syscap SystemCapability.ArkUI.ArkUI.Full* crossplatform* since 10*/reuseId(id: string)入口组件的示例代码如下 Entry
Component
struct Index {private data: ImageListDataSource new ImageListDataSource()build() {List({ space: 3 }) {LazyForEach(this.data, (item: MyImage) {ListItem() {MyListItem({ item: item })// .reuseId(item.image_id)}}, item item)}}
}注意事项 可以访问站点developtools_ace_ets2bundle: -- - Gitee.com查看组件复用的一些示例这些是用于测试的例子。 Reusable之前的装饰器的名称为Recycle旧名称不使用了。ForEach渲染控制具有全展开的特性不能触发组件复用。 总结 本文介绍了开发OpenHarmony应用时如何使用组件复用能力提供代码示例期望帮助关注组件复用的开发者朋友们。 如有任何问题欢迎交流讨论。 参考资料 [1] Sample聊天实例应用 [2] 自定义组件的生命周期 [3] 组件复用场景 [4] 组件复用一些示例