当前位置: 首页 > news >正文

第八节HarmonyOS @Component自定义组件的生命周期

在开始之前,我们先明确自定义组件和页面的关系:

1、自定义组件:@Component装饰的UI单元,可以组合多个系统组件实现UI的复用。

2、页面:即应用的UI页面。可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。只有被@Entry装饰的组件才可以调用页面的生命周期。

页面生命周期,即被@Entry装饰的组件生命周期,提供以下生命周期接口:

onPageShow:页面每次显示时触发。

onPageHide:页面每次隐藏时触发一次。

onBackPress:当用户点击返回按钮时触发。

组件生命周期,即一般用@Component装饰的自定义组件的生命周期,提供以下生命周期接口:

aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。

aboutToDisappear:在自定义组件即将析构销毁时执行。

有@Entity修饰的组件,既有页面的生命周期也有组件的生命周期:

// Index.ets
import router from '@ohos.router';@Entry
@Component
struct LifeCycleComponent {@State showChild: boolean = true;// 只有被 @Entry 装饰的组件才可以调用页面的生命周期onPageShow() {console.info('Index onPageShow');}// 只有被 @Entry 装饰的组件才可以调用页面的生命周期onPageHide() {console.info('Index onPageHide');}// 只有被 @Entry 装饰的组件才可以调用页面的生命周期onBackPress() {console.info('Index onBackPress');}// 组件生命周期aboutToAppear() {console.info('LifeCycleComponent aboutToAppear');}// 组件生命周期aboutToDisappear() {console.info('LifeCycleComponent aboutToDisappear');}build() {Column() {// this.showChild 为 true,创建 Child 子组件,执行 Child aboutToAppearif (this.showChild) {Child()}// this.showChild 为 false,删除 Child 子组件,执行 Child aboutToDisappearButton('create or delete Child').onClick(() => {this.showChild = false;})// push 到 Page2 页面,执行 onPageHideButton('push to next page').onClick(() => {router.pushUrl({ url: 'pages/Page2' });})}}
}

无@Entity修饰的组件,只有组件的生命周期:

@Component
struct Child {@State title: string = 'Hello World';// 组件生命周期aboutToDisappear() {console.info('[lifeCycle] Child aboutToDisappear')}// 组件生命周期aboutToAppear() {console.info('[lifeCycle] Child aboutToAppear')}build() {Text(this.title).fontSize(50).onClick(() => {this.title = 'Hello ArkUI';})}
}

总结:

第一个页面Index页面有@Entity修饰,第二个页面Second中无@Entity修饰

1、首次打开应用,加载的是Index页,生命周期是:

2、页面从index 跳转到 Second页,生命周期是:

3、在Second页将应用后台运行并且会前台:

4、页面从Second跳转到 index 页,生命周期是:

5、销毁应用,,生命周期是:

相关文章:

  • ubuntu虚拟机设置跳不出来
  • 【Rust】所有权的认识
  • 华为 ArkTS 边框怎么设置,当边边框怎么设置(鸿蒙开发)
  • 模拟电路学习笔记(一)之芯片篇(持续更新)
  • postgreSQL 查询所有模式的语句
  • 2023年JetBrains开发调查:Java 8仍广泛使用
  • MyBatis查询优化:枚举在条件构建中的妙用
  • OA系统是什么,能用低代码开发吗?
  • 外包干了2个月,技术明显退步了...
  • Sequential Modeling Enables Scalable Learning for Large Vision Models
  • Spring Security 6.x 系列(7)—— 源码分析之Builder设计模式
  • RK3568平台开发系列讲解(Linux系统篇)device_node 转换成 platform_device
  • CCF CSP认证 历年题目自练Day51
  • uniapp搭建内网映射测试https域名
  • vscode + Linux 如何在编辑器调试webserver这类完整C++项目
  • 78. Subsets
  • HTTP--网络协议分层,http历史(二)
  • interface和setter,getter
  • Java 网络编程(2):UDP 的使用
  • mongodb--安装和初步使用教程
  • Odoo domain写法及运用
  • php面试题 汇集2
  • PHP那些事儿
  • Python进阶细节
  • Vue2.0 实现互斥
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 动态规划入门(以爬楼梯为例)
  • 关于extract.autodesk.io的一些说明
  • 和 || 运算
  • 后端_MYSQL
  • 开源地图数据可视化库——mapnik
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 使用 Docker 部署 Spring Boot项目
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​2021半年盘点,不想你错过的重磅新书
  • ​Python 3 新特性:类型注解
  • !!java web学习笔记(一到五)
  • # 飞书APP集成平台-数字化落地
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (汇总)os模块以及shutil模块对文件的操作
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • ***通过什么方式***网吧
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .gitignore文件---让git自动忽略指定文件
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • @RequestParam详解
  • @Transactional 详解
  • [2023年]-hadoop面试真题(一)