HarmonyOS—详解自定义组件的生命周期

前言

自定义组件 的生命周期回调函数用于通知用户该自定义组件的生命周期,这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。

下图展示的是被@Entry装饰的 组件生命周期:

今天根据上面的流程图,我们从自定义组件的初始创建、重新渲染和删除来一一详细解释。

说明:允许在生命周期函数中使用Promise和异步回调函数,比如网络资源获取,定时器设置等;

aboutToAppear

aboutToAppear?(): void

aboutToAppear函数在创建自定义组件的新实例后,在执行其build()函数之前执行。允许在aboutToAppear函数中改变状态变量,更改将在后续执行build()函数中生效。

注意⚠️:从API version 9开始,该接口支持在ArkTS卡片中使用。

aboutToDisappear

aboutToDisappear?(): void

aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

注意⚠️:从API version 9开始,该接口支持在ArkTS卡片中使用。

onPageShow

onPageShow?(): void

页面每次显示时触发一次,包括路由过程、应用进入前台等场景,仅@Entry装饰的自定义组件生效。

onPageHide

onPageHide?(): void

页面每次隐藏时触发一次,包括路由过程、应用进入前后台等场景,仅@Entry装饰的自定义组件生效。

onBackPress

onBackPress?(): void

当用户点击返回按钮时触发,仅@Entry装饰的自定义组件生效。

@Entry
@Component
struct IndexComponent {
   
  @State textColor: Color = Color.Black;

  onPageShow() {
   
    this.textColor = Color.Blue;
    console.info('IndexComponent onPageShow');
  }

  onPageHide() {
   
    this.textColor = Color.Transparent;
    console.info('IndexComponent onPageHide');
  }

  onBackPress() {
   
    this.textColor = Color.Red;
    console.info('IndexComponent onBackPress');
  }

  build() {
   
    Column() {
   
      Text('Hello World')
        .fontColor(this.textColor)
        .fontSize(30)
        .margin(30)
    }.width('100%')
  }
}

onLayout9+

onLayout?(children: Array<LayoutChild>, constraint: ConstraintSizeOptions): void

框架会在自定义组件布局时,将该自定义组件的子节点信息和自身的尺寸范围通过onLayout传递给该自定义组件。不允许在onLayout函数中改变状态变量。

注意⚠️:从API version 9开始,该接口支持在ArkTS卡片中使用。

参数说明:

参数名称 参数类型 参数说明
children Array 子组件布局信息。
constraint ConstraintSizeOptions 父组件constraint信息。

onMeasure9+

onMeasure?(children: Array<LayoutChild>, constraint: ConstraintSizeOptions): void

框架会在自定义组件确定尺寸时,将该自定义组件的子节点信息和自身的尺寸范围通过onMeasure传递给该自定义组件。不允许在onMeasure函数中改变状态变量。

注意⚠️:从API version 9开始,该接口支持在ArkTS卡片中使用。
参数说明:

参数名称 参数类型 参数说明
children Array 子组件布局信息。
constraint ConstraintSizeOptions 父组件constraint信息。

LayoutChild9+

子组件布局信息。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数名称 参数类型 描述
name string 子组件名称。
id string 子组件id。
constraint ConstraintSizeOptions 子组件约束尺寸。
borderInfo LayoutBorderInfo 子组件border信息。
position Position 子组件位置坐标。
measure (childConstraint: ConstraintSizeOptions) => void 调用此方法对子组件的尺寸范围进行限制。
layout (LayoutInfo: LayoutInfo) => void 调用此方法对子组件的位置信息进行限制。

LayoutBorderInfo9+

子组件border信息。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数名称 参数类型 描述
borderWidth EdgeWidths 边框宽度类型,用于描述组件边框不同方向的宽度。
margin Margin 外边距类型,用于描述组件不同方向的外边距。
padding Padding 内边距类型,用于描述组件不同方向的内边距。

LayoutInfo9+

子组件layout信息。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数名称 参数类型 描述
position Position 子组件位置坐标。
constraint ConstraintSizeOptions 子组件约束尺寸。
@Entry
@Component
struct Index {
   
  build() {
   
    Column() {
   
      CustomLayout() {
   
        ForEach([1, 2, 3], (index) => {
   
          Text('Sub' + index)
            .fontSize(30)
            .borderWidth(2)
        })
      }
    }
  }
}



@Component
struct CustomLayout {
   
  @BuilderParam builder: () => {
   };

  onLayout(children: Array<LayoutChild>, constraint: ConstraintSizeOptions) {
   
    let pos = 0;
    children.forEach((child) => {
   
      child.layout({
    position: {
    x: pos, y: pos }, constraint: constraint })
      pos += 100;
    })
  }

  onMeasure(children: Array<LayoutChild>, constraint: ConstraintSizeOptions) {
   
    let size = 100;
    children.forEach((child) => {
   
      child.measure({
    minHeight: size, minWidth: size, maxWidth: size, maxHeight: size })
      size += 50;
    })
  }

  build() {
   
    this.builder()
  }
}

运行效果如下:

总结

自定义组件的生命周期 回调函数 用于通知用户该自定义组件的生命周期,这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。合理的掌握和使用组件的生命周期函数可以帮助我们更好开发和实现需求功能。

为了能让大家更好的学习鸿蒙 (Harmony OS) 开发技术,这边特意整理了《鸿蒙 (Harmony OS)开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙 (Harmony OS)开发学习手册》

入门必看:https://qr21.cn/FV7h05

  1. 应用开发导读(ArkTS)
  2. 应用开发导读(Java)

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. 构建第一个JS应用
  4. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

相关推荐

  1. 【鸿蒙定义组件生命周期

    2023-12-18 23:38:04       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-18 23:38:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-18 23:38:04       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-18 23:38:04       87 阅读
  4. Python语言-面向对象

    2023-12-18 23:38:04       96 阅读

热门阅读

  1. 数据结构基础小结

    2023-12-18 23:38:04       55 阅读
  2. autosar是rtos的一种

    2023-12-18 23:38:04       55 阅读
  3. Python文件命名规则:批量重命名与规则匹配的文件

    2023-12-18 23:38:04       55 阅读
  4. 记错vue3+ts require 报错

    2023-12-18 23:38:04       59 阅读
  5. 3.4【窗口】窗口的几何形状(三,窗口旋转)

    2023-12-18 23:38:04       56 阅读
  6. 抖音ip地址切换会看不到视频吗

    2023-12-18 23:38:04       100 阅读
  7. AI全栈大模型工程师(十二)AI的未来

    2023-12-18 23:38:04       59 阅读
  8. android 13.0 设置上网应用白名单(上网app白名单)

    2023-12-18 23:38:04       128 阅读