理解 ArkTS 的生命周期是性能优化的第一步。ArkTS 的生命周期分为两类:**自定义组件(@Component)的生命周期和页面(@Entry)**特有的生命周期。
1. ArkTS 组件生命周期概览
自定义组件(@Component)通用生命周期:
- aboutToAppear:组件实例创建后,执行
build()之前执行。适合初始化数据(如发起网络请求、改变状态变量)。 - aboutToDisappear:组件销毁之前执行。适合清理资源(如取消定时器、释放引用)。
页面特有生命周期(仅被 @Entry 装饰的组件拥有):
- onPageShow:页面显示时触发(从后台切回前台,或路由跳转进来)。
- onPageHide:页面隐藏时触发(切到后台,或跳转到其他页面)。
- onBackPress:用户点击物理返回键时触发。
2. build() 是不是每次状态变化都会调用?
答案:是的,但它是“智能”的局部调用。
每当组件关联的状态变量(如 @State)发生改变时,ArkUI 会触发 重绘(Re-render) 逻辑:
-
触发重绘: 状态改变通知观察者。
-
执行
build(): 框架重新执行build()函数中的 UI 描述代码。 -
按需更新(Diff): * 虽然
build()内部的代码被重新跑了一遍,但 ArkUI 不会销毁并重建所有原生节点。- 它会对比新旧 UI 描述。例如,如果你只改了
Text的内容,框架只会调用底层原生的setText方法。 - 注意: 如果你在
build()里写了复杂的计算逻辑,每次状态变动都会重新计算,这会影响性能。绝对不要在build内部修改状态变量。
- 它会对比新旧 UI 描述。例如,如果你只改了
3. 生命周期顺序如何保证?
ArkUI 通过渲染引擎的确定性流水线来保证顺序。以下是一个页面从加载到销毁的标准时序:
场景 A:打开一个新页面
- Constructor:创建组件实例。
- aboutToAppear:初始化数据(此时 UI 还没画出来)。
- build() :生成 UI 描述树(执行渲染逻辑)。
- onPageShow:页面正式出现在屏幕上。
场景 B:页面内状态更新
- State Change:状态变量 Setter 被触发。
- build() :重新执行 UI 描述逻辑,进行增量更新(不触发
aboutToAppear)。
场景 C:关闭页面/返回
- onPageHide:页面从屏幕消失。
- aboutToDisappear:组件准备销毁,清理内存。
4. 深度细节:父子组件的生命周期顺序
这是很多开发者踩坑的地方。当父组件包含子组件时,顺序如下:
-
创建时:
父 aboutToAppear->子 aboutToAppear->子 build->父 build。- 逻辑:父组件先初始化,然后扫描到子组件并初始化子组件,子组件画完了,父组件才算画完。
-
销毁时:
父 aboutToDisappear->子 aboutToDisappear。- 逻辑:树根先断开,分枝随之销毁。
性能优化小贴士:
- 不要在
build()里写console.log: 因为build触发极其频繁,日志打印会拖慢 UI 线程。 - 懒加载机制: 对于
List或Grid,子组件的aboutToAppear只有在滚动到可视区域时才会触发。 - 耗时操作: 网络请求应放在
aboutToAppear。如果放在onPageShow,每次切回应用都会重新请求,可能造成不必要的开销。