HarmonyOS 页面生命周期完整梳理:aboutToAppear、onPageShow、onPageHide 别再混着用

系列:HarmonyOS 开发入门 · 05

HarmonyOS 生命周期最容易踩坑的地方,不是回调太多,而是不同层级的生命周期名字很像

组件有组件生命周期,页面有页面生命周期;换成 Navigation 后,NavDestination 又有自己的一套页面生命周期。

如果全部当成"页面出现了"来用,接口请求很容易重复触发。

1. 先分清:组件生命周期和页面生命周期

普通 ArkUI 自定义组件常见:

ts 复制代码
aboutToAppear()
aboutToDisappear()

页面入口组件还可以关注:

ts 复制代码
onPageShow()
onPageHide()
onBackPress()

两组不是一回事。

2. aboutToAppear 什么时候触发

aboutToAppear 是组件级生命周期。

自定义组件实例创建后、build() 执行前会触发。

ts 复制代码
@Component
struct UserCard {
  aboutToAppear() {
    console.info('UserCard aboutToAppear')
  }

  build() {
    Text('User')
  }
}

它适合做与"组件创建"绑定的轻量初始化。

但如果这个组件在列表里出现 100 次,那它也可能创建很多次。所以不要看到 aboutToAppear 就塞网络请求。

3. onPageShow 才是页面显示语义

对于 @Entry 页面:

ts 复制代码
onPageShow() {
  console.info('page show')
}

onPageHide() {
  console.info('page hide')
}

页面从其他页面返回、应用从后台回到前台等场景,都可能触发 onPageShow

因此它更适合:

  • 页面每次重新可见时刷新;
  • 回到前台后重新检查状态;
  • 刷新可能被其他页面修改的数据。

但它不等于"只执行一次"。

4. 首次进入时大概发生什么

一个简单页面首次创建时,可以理解成:

text 复制代码
aboutToAppear
↓
build
↓
页面展示
↓
onPageShow

如果还有子组件,子组件也会走自己的创建生命周期。

所以把初始化同时写在 aboutToAppearonPageShow,非常容易执行两遍。

5. 页面切到后台

应用进入后台时,当前页面通常会收到隐藏相关回调,但组件本身未必被销毁。

这点很重要:

"看不见"不等于"被销毁"。

因此资源释放要区分:

  • 页面暂时不可见;
  • 组件真正销毁。

比如暂停一个页面动画,可以放在页面隐藏时;注销只属于组件实例的监听,则更适合在销毁时处理。

6. aboutToDisappear 不适合再改状态

组件即将销毁时,做清理是合理的:

ts 复制代码
aboutToDisappear() {
  // 注销监听、释放当前组件资源
}

但不要在这里继续修改会触发 UI 更新的状态变量。

组件都准备离开组件树了,再发起一轮状态刷新通常没有意义,还可能引发不稳定行为。

7. 一个常见错误:接口请求两次

假设你写了:

ts 复制代码
aboutToAppear() {
  this.loadData()
}

onPageShow() {
  this.loadData()
}

首屏就可能请求两次。

更合理的方式是先明确业务:

只在首次创建加载

放在组件创建语义中,并确保组件不会频繁被重新创建。

每次返回页面都刷新

使用页面展示语义。

首次加载一次,后续按条件刷新

增加状态控制:

ts 复制代码
@State hasLoaded: boolean = false

onPageShow() {
  if (!this.hasLoaded) {
    this.hasLoaded = true
    this.loadData()
    return
  }

  this.refreshIfNeeded()
}

现在新项目更推荐使用 Navigation + NavPathStack

这时页面通常以 NavDestination 为核心,页面显示、隐藏、销毁会有更明确的 Navigation 生命周期事件。

所以如果项目已经全面使用 Navigation,不建议继续拿旧的页面路由思路硬套。

我后面会单独用一篇文章讲 NavDestination 生命周期。

9. 我的实际建议

写生命周期代码前先问三个问题:

  1. 这是"组件创建"还是"页面重新可见"?
  2. 这段逻辑需要执行一次还是每次都执行?
  3. 页面隐藏时只是暂停,还是要真正释放?

这三个问题想清楚,生命周期代码基本不会乱。

总结

最容易记的一句话:

aboutToAppear 关注组件创建,onPageShow 关注页面再次可见。

下一篇再往上一层,聊 UIAbility 生命周期。它和页面生命周期不是替代关系,而是应用组件层级更高的一套机制。

相关推荐
lilian23330 分钟前
HarmonyOS 7 新特性(五)|ContainerReader 容器断点与自适应布局
前端·华为·harmonyos
less_121381 小时前
HarmonyOS WPS Open SDK:统一版二开接入主线与能力分层概述
华为·harmonyos·wps
大雷神2 小时前
HarmonyOS APP<<古今职鉴定>>开源教程第13篇:隔空投送:ShareKit 分享服务
华为·华为云·harmonyos
时光慢煮2 小时前
开源鸿蒙PC上手体验:从 Windows 和 macOS 切换过来,我被惊艳到了
windows·开源·harmonyos
tsqtsqtsq03092 小时前
鸿蒙电脑升级 HarmonyOS 7:深度解析与 API 26 全特性指南
华为·电脑·harmonyos
lilian2335 小时前
HarmonyOS 7 新特性(一)|API 26 Beta2 十项变化与应用适配路线
华为·harmonyos
HwJack205 小时前
鸿蒙ArkData键值型数据库实战:Schema 定义与商品库存同步案例
数据库·华为·harmonyos
m0_7496902319 小时前
【寻迹校园 HarmonyOS NEXT 实战 41】用户照片、演示图与图标兜底:ReportMedia 的三层媒体策略
华为·harmonyos·arkts·媒体·隐私保护
夜雨声烦丿20 小时前
用 ArkTS 做好智能便签应用(端云协同):从核心 API 到可验证交互
华为·harmonyos