【HarmonyOS】HarmonyOS NEXT学习日记:七、页面与组件的生命周期

【HarmonyOS】HarmonyOS NEXT学习日记:七、页面与组件的生命周期

页面和组件

  • 组件:用@Component装饰的代码称为自定义组件
  • 页面:@Entry装饰的组件即页面的根节点

组件生命周期

aboutToAppear:在创建自定义组件的新实例后,在执行其build()函数之前执行。允许在aboutToAppear函数中改变状态变量,更改将在后续执行build()函数中生效。

aboutToDisappear:在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

页面生命周期

onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景,仅@Entry装饰的自定义组件生效。

onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景,仅@Entry装饰的自定义组件生效。

onBackPress:当用户点击返回按钮时触发,仅@Entry装饰的自定义组件生效。返回true表示页面自己处理返回逻辑,不进行页面路由;返回false表示使用默认的路由返回逻辑,不设置返回值按照false处理。

代码示例

bash 复制代码
// Index.ets
import text from '@ohos.graphics.text'
import { router } from '@kit.ArkUI';
// 导入业务错误处理模块
import { BusinessError } from '@kit.BasicServicesKit';
@Builder function TextItem(text: string){
  Text(text)
    .fontSize(18)
    .fontColor(Color.Red)
    .backgroundColor('#ccc')
    .lineHeight(30)
    .width('100%')
    .textAlign(TextAlign.Center)
    .onClick(()=>{
      router.pushUrl({ url: 'pages/Second' }).then(() => { // 调用 router 模块的 pushUrl 方法跳转到第二页
        console.info('Succeeded in jumping to the second page.') // 在控制台输出跳转成功的日志信息
      }).catch((err: BusinessError) => { // 捕捉跳转过程中的错误
        console.error(`Failed to jump to the second page. Code is ${err.code}, message is ${err.message}`) // 在控制台输出跳转失败的错误信息,包括错误代码和错误信息
      })
    })
}
@Entry
@Component
struct Index {
  @State text: string = '111'
  @State showChildren: boolean = false;
  onPageShow() {
    this.text = 'onPageShow';
    console.info('IndexComponent onPageShow');
  }
  onPageHide() {
    this.text = 'onPageHide';
    console.info('IndexComponent onPageHide');
  }
  aboutToAppear(){
    this.text = '222'
    console.info('IndexComponent aboutToAppear');
  }
  aboutToDisappear(){
    console.info('IndexComponent aboutToDisappear');
  }
  build() {
    Column(){
      TextItem(this.text)
      if(this.showChildren){
        Child()
      }
      Button('修改children可见')
        .onClick(()=>{
          this.showChildren = !this.showChildren
        })
    }
  }
}
@Component
struct Child {
  @State title: string = 'Children';
  aboutToDisappear() {
    console.info('Child aboutToDisappear')
  }
  aboutToAppear() {
    console.info('Child aboutToAppear')
  }
  build() {
    Text(this.title).fontSize(50).onClick(() => {
      this.title = 'Children Changed';
    })
  }
}
页面初始化结束后

可以看到的是,我们定义text变量时赋值的'111'在aboutToAppear中已经被修改为'222'了,最终渲染出来的就是'222';

从日志中我们可以观察到,aboutToDisappear的执行时机在onPageShow之前。

然后我们点击跳转一下页面(离开页面)

日志如下

组件并未被销毁,所以没有进入aboutToDisappear,但是因为离开了页面,所以进入了onPageHide。

当我们再次返回index页面(进入页面)

将会再次触发onPageShow,每一次页面显示时都会触发。

那么当我们点击按钮呢?(创建组件)

chidren子组件被渲染了出来,也出发了子组件的aboutToAppear。

再次点击按钮(销毁组件)

将会触发子组件的销毁进入aboutToDisappear,同时页面上的子组件也消失不见。

总结

复制代码
          页面显示
            |

ActivityA:onPageShow
------ 组件生命周期 ------
复制代码
            |
      组件将要出现
            |

CustomComponent:aboutToAppear
复制代码
            |
   组件的渲染和交互
            |
  用户按下返回按钮
            |

ActivityA:onBackPress
复制代码
            |
    组件将要消失
            |

CustomComponent:aboutToDisappear
复制代码
          |
       页面隐藏
            |

ActivityA:onPageHide
相关推荐
遇到困难睡大觉哈哈5 小时前
Harmony os 静态卡片(ArkTS + FormLink)详细介绍
前端·microsoft·harmonyos·鸿蒙
遇到困难睡大觉哈哈6 小时前
Harmony os——ArkTS 语言笔记(四):类、对象、接口和抽象类
java·笔记·spring·harmonyos·鸿蒙
STLearner7 小时前
AI论文速读 | U-Cast:学习高维时间序列预测的层次结构
大数据·论文阅读·人工智能·深度学习·学习·机器学习·数据挖掘
小雨青年7 小时前
MateChat 进阶实战:打造零后端、隐私安全的“端侧记忆”智能体
前端·华为·ai·华为云·状态模式
黑客思维者8 小时前
LLM底层原理学习笔记:Adam优化器为何能征服巨型模型成为深度学习的“速度与稳定之王”
笔记·深度学习·学习·llm·adam优化器
kk哥88998 小时前
Swift底层原理学习笔记
笔记·学习·swift
国服第二切图仔9 小时前
Electron for 鸿蒙pc项目实战之tab标签页组件
javascript·electron·harmonyos·鸿蒙pc
AA陈超10 小时前
Lyra学习004:GameFeatureData分析
c++·笔记·学习·ue5·虚幻引擎
zkl_zkl_11 小时前
地理信息系统学习笔记——第六章 空间数据采集与处理
笔记·学习·数据处理·数据质量·空间数据
是Dream呀11 小时前
昇腾实战|算子模板库Catlass与CANN生态适配
开发语言·人工智能·python·华为