2-8.【ArkTS】ArkTS 组件生命周期有哪些?build 是不是每次状态变化都会调用?生命周期顺序如何保证?

4 阅读3分钟

理解 ArkTS 的生命周期是性能优化的第一步。ArkTS 的生命周期分为两类:**自定义组件(@Component)的生命周期和页面(@Entry)**特有的生命周期。


1. ArkTS 组件生命周期概览

自定义组件(@Component)通用生命周期:

  • aboutToAppear:组件实例创建后,执行 build() 之前执行。适合初始化数据(如发起网络请求、改变状态变量)。
  • aboutToDisappear:组件销毁之前执行。适合清理资源(如取消定时器、释放引用)。

页面特有生命周期(仅被 @Entry 装饰的组件拥有):

  • onPageShow:页面显示时触发(从后台切回前台,或路由跳转进来)。
  • onPageHide:页面隐藏时触发(切到后台,或跳转到其他页面)。
  • onBackPress:用户点击物理返回键时触发。

2. build() 是不是每次状态变化都会调用?

答案:是的,但它是“智能”的局部调用。

每当组件关联的状态变量(如 @State)发生改变时,ArkUI 会触发 重绘(Re-render) 逻辑:

  1. 触发重绘: 状态改变通知观察者。

  2. 执行 build() 框架重新执行 build() 函数中的 UI 描述代码。

  3. 按需更新(Diff): * 虽然 build() 内部的代码被重新跑了一遍,但 ArkUI 不会销毁并重建所有原生节点。

    • 它会对比新旧 UI 描述。例如,如果你只改了 Text 的内容,框架只会调用底层原生的 setText 方法。
    • 注意: 如果你在 build() 里写了复杂的计算逻辑,每次状态变动都会重新计算,这会影响性能。绝对不要在 build 内部修改状态变量。

3. 生命周期顺序如何保证?

ArkUI 通过渲染引擎的确定性流水线来保证顺序。以下是一个页面从加载到销毁的标准时序:

场景 A:打开一个新页面

  1. Constructor:创建组件实例。
  2. aboutToAppear:初始化数据(此时 UI 还没画出来)。
  3. build() :生成 UI 描述树(执行渲染逻辑)。
  4. onPageShow:页面正式出现在屏幕上。

场景 B:页面内状态更新

  1. State Change:状态变量 Setter 被触发。
  2. build() :重新执行 UI 描述逻辑,进行增量更新(不触发 aboutToAppear)。

场景 C:关闭页面/返回

  1. onPageHide:页面从屏幕消失。
  2. aboutToDisappear:组件准备销毁,清理内存。

4. 深度细节:父子组件的生命周期顺序

这是很多开发者踩坑的地方。当父组件包含子组件时,顺序如下:

  • 创建时: 父 aboutToAppear -> 子 aboutToAppear -> 子 build -> 父 build

    • 逻辑:父组件先初始化,然后扫描到子组件并初始化子组件,子组件画完了,父组件才算画完。
  • 销毁时: 父 aboutToDisappear -> 子 aboutToDisappear

    • 逻辑:树根先断开,分枝随之销毁。

性能优化小贴士:

  1. 不要在 build() 里写 console.log 因为 build 触发极其频繁,日志打印会拖慢 UI 线程。
  2. 懒加载机制: 对于 ListGrid,子组件的 aboutToAppear 只有在滚动到可视区域时才会触发。
  3. 耗时操作: 网络请求应放在 aboutToAppear。如果放在 onPageShow,每次切回应用都会重新请求,可能造成不必要的开销。