HarmonyOS7 组件生命周期:aboutToAppear 到销毁全解
文章目录
- 前言
- 组件生命周期全流程
- 代码实现
- aboutToAppear:出场前准备
- 核心代码
- aboutToDisappear:退场前清理
- 完整示例
- Ability 的生命周期(页面级)
- 常见误区(小白必踩)
- 完整可运行示例:生命周期串联
- 代码解析
- 写在最后
前言
每个自定义组件从"被创建"到"被销毁",中间会经过几个固定的时间点。系统在这些时间点回调你对应的函数,让你有机会"初始化"和"清理"。
这就是组件生命周期。搞懂它,你才知道"数据该在哪加载"“资源该在哪释放”。这篇文章把@ComponentV2组件的生命周期函数逐个讲清,配合时序图思路。
组件生命周期全流程
一个组件的典型轨迹:
代码实现
创建 → aboutToAppear(即将出现)→ 首次 build 渲染 → 运行中(状态变化触发重 build) → aboutToDisappear(即将消失)→ 销毁释放build()是"画 UI",而aboutToAppear/aboutToDisappear是"画之前准备、移除前清理"。
aboutToAppear:出场前准备
组件即将第一次显示时调用,只调一次。适合做"初始化、拉数据、注册监听"。
核心代码
@ComponentV2struct UserPage{@Localuser:User|null=nullaboutToAppear(){// 出场前拉数据this.loadUser()// 注册全局主题监听AppStorage.on('theme',this.onTheme)}asyncloadUser(){this.user=awaitapi.getUser()}}- 所有"进场就要准备好的事"放这里:请求数据、订阅状态、启动定时器。
- 此时组件已绑定,可以安全地赋值状态、触发 UI 更新。
aboutToDisappear:退场前清理
组件即将从界面移除时调用,只调一次。适合"释放资源、注销监听、关连接"。
完整示例
aboutToDisappear(){AppStorage.off('theme',this.onTheme)// 注销监听,防泄漏this.timer&&clearInterval(this.timer)// 清定时器this.ws?.close()// 关长连接}这是防止内存泄漏的关键钩子。前面"内存管理 8 条军规"里反复强调的"谁开的谁关",就落实在这里。
Ability 的生命周期(页面级)
比组件更大的是Ability(页面/入口),它有自己的生命周期:
| 回调 | 时机 | 常见用途 |
|---|---|---|
onCreate | Ability 创建 | 全局初始化 |
onWindowStageCreate | 窗口就绪 | 加载根页面 |
onForeground | 进入前台 | 恢复数据/计时 |
onBackground | 退到后台 | 暂停/保存 |
onDestroy | 销毁 | 释放全局资源 |
组件生命周期是"局部",Ability 生命周期是"全局"——两者嵌套:Ability 在前台时,里面的组件才经历 aboutToAppear。
常见误区(小白必踩)
| 误区 | 说明 |
|---|---|
在build里做初始化/请求 | build可能多次执行,在里面请求会重复发,初始化放aboutToAppear。 |
| 不清理资源 | 监听器、连接、定时器在aboutToDisappear里一一释放,防泄漏。 |
| 钩子放错 | 只该执行一次的放aboutToAppear,每次重画要更新的放build或事件里。 |
下面这段代码可以直接复制到 DevEco Studio 里运行。建议你边读边敲,改一改文末「动手改一改」里的参数,亲眼看看效果。
完整可运行示例:生命周期串联
把组件从创建到销毁的关键回调都打出来,看清顺序。
代码解析
// 组件生命周期回调@Entry@Componentstruct Lifecycle{aboutToAppear():void{console.info('1. aboutToAppear:即将首次渲染')}onPageShow():void{console.info('2. onPageShow:页面前台显示')}aboutToDisappear():void{console.info('3. aboutToDisappear:即将销毁,做清理')}build(){Column(){Text('看 Log 顺序').fontSize(20)}.padding(20)}}你会看到什么:进入页面依次打印aboutToAppear→onPageShow;退出时打印aboutToDisappear。在这里做「初始化 / 反注册 / 释放资源」最合适。
动手改一改:
- 在
aboutToAppear里发首屏请求,在aboutToDisappear里clearInterval。 - 用
onPageHide暂停音视频播放,回到前台再恢复。 - 在子组件也加这些回调,观察父子生命周期先后顺序。
写在最后
生命周期就是两个最常用的钩子:aboutToAppear 管"进场准备"(拉数据、注册),aboutToDisappear 管"退场清理"(注销、释放)。Ability 那层(onCreate/onForeground/onDestroy)是更大尺度的同款逻辑。
记住一句话就不会乱:进场要准备、退场要打扫。把你组件里那些"开着没关"的监听和连接,都请进aboutToDisappear——这是写出不漏内存 app 的基本功。