前言

每个自定义组件从"被创建"到"被销毁",中间会经过几个固定的时间点。系统在这些时间点回调你对应的函数,让你有机会"初始化"和"清理"。

这就是组件生命周期。搞懂它,你才知道"数据该在哪加载"“资源该在哪释放”。这篇文章把 @ComponentV2 组件的生命周期函数逐个讲清,配合时序图思路。

组件生命周期全流程

A hand-drawn doodle illustration on pure white pap

一个组件的典型轨迹:

代码实现

创建 → aboutToAppear(即将出现)→ 首次 build 渲染 → 运行中(状态变化触发重 build)
     → aboutToDisappear(即将消失)→ 销毁释放

build() 是"画 UI",而 aboutToAppear/aboutToDisappear 是"画之前准备、移除前清理"。

aboutToAppear:出场前准备

组件即将第一次显示时调用,只调一次。适合做"初始化、拉数据、注册监听"。

核心代码

@ComponentV2
struct UserPage {
  @Local user: User | null = null

  aboutToAppear() {
    // 出场前拉数据
    this.loadUser()
    // 注册全局主题监听
    AppStorage.on('theme', this.onTheme)
  }

  async loadUser() {
    this.user = await api.getUser()
  }
}

A hand-drawn doodle illustration on pure white pap

  • 所有"进场就要准备好的事"放这里:请求数据、订阅状态、启动定时器。
  • 此时组件已绑定,可以安全地赋值状态、触发 UI 更新。

aboutToDisappear:退场前清理

组件即将从界面移除时调用,只调一次。适合"释放资源、注销监听、关连接"。

完整示例

A hand-drawn doodle illustration on pure white pap

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
@Component
struct 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)
  }
}

你会看到什么:进入页面依次打印 aboutToAppearonPageShow;退出时打印 aboutToDisappear。在这里做「初始化 / 反注册 / 释放资源」最合适。

动手改一改

  • aboutToAppear 里发首屏请求,在 aboutToDisappearclearInterval
  • onPageHide 暂停音视频播放,回到前台再恢复。
  • 在子组件也加这些回调,观察父子生命周期先后顺序。

写在最后

生命周期就是两个最常用的钩子:aboutToAppear 管"进场准备"(拉数据、注册),aboutToDisappear 管"退场清理"(注销、释放)。Ability 那层(onCreate/onForeground/onDestroy)是更大尺度的同款逻辑。

记住一句话就不会乱:进场要准备、退场要打扫。把你组件里那些"开着没关"的监听和连接,都请进 aboutToDisappear——这是写出不漏内存 app 的基本功。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐