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

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

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

页面和组件

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

组件生命周期

aboutToAppear:在创建自定义组件的新实例后,在执行其build()函数之前执行。允许在aboutToAppear函数中改变状态变量,更改将在后续执行build()函数中生效。
aboutToDisappear:在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

页面生命周期

onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景,仅@Entry装饰的自定义组件生效。
onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景,仅@Entry装饰的自定义组件生效。
onBackPress:当用户点击返回按钮时触发,仅@Entry装饰的自定义组件生效。返回true表示页面自己处理返回逻辑,不进行页面路由;返回false表示使用默认的路由返回逻辑,不设置返回值按照false处理。

代码示例

// 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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • day4 vue2以及ElementUI
  • 滞回比较器工作原理,应用,TINA仿真
  • 7月23日JavaSE学习笔记
  • scrapy出现OSError: could not get source code错误解决
  • 【MQTT(5)】php 做一个mqtt按钮,发布触发信号
  • Amazon Bedrock + Amazon DynamoDB 数据设计与建模
  • scrapy 爬取旅游景点相关数据(一)
  • QT基础教程(QEvent事件和事件过滤器)
  • MATLAB禁忌蚁群算法求解充电电动车辆路径规划EVRP代码实例
  • 使用 Swagger 在 Golang 中进行 API 文档生成
  • 深入解析C#中的URI和URL编码:理解EscapeDataString、EscapeUriString和UrlEncode的区别及字符编码错误处理
  • SpringCloud之feign
  • 前端三大主流框架对比
  • 流媒体服务器一:使用成熟的流媒体SRS 搭建 RTMP流媒体服务器
  • Java的序列化和反序列化
  • JavaScript 如何正确处理 Unicode 编码问题!
  • __proto__ 和 prototype的关系
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【css3】浏览器内核及其兼容性
  • 78. Subsets
  • C++入门教程(10):for 语句
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JS笔记四:作用域、变量(函数)提升
  • Js基础——数据类型之Null和Undefined
  • magento2项目上线注意事项
  • Mithril.js 入门介绍
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • React-flux杂记
  • SOFAMosn配置模型
  • uva 10370 Above Average
  • Xmanager 远程桌面 CentOS 7
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 普通函数和构造函数的区别
  • 探索 JS 中的模块化
  • 跳前端坑前,先看看这个!!
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 06-01 点餐小程序前台界面搭建
  • postgresql行列转换函数
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • #07【面试问题整理】嵌入式软件工程师
  • (19)夹钳(用于送货)
  • (C语言)共用体union的用法举例
  • (二)linux使用docker容器运行mysql
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (九)One-Wire总线-DS18B20
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (转) 深度模型优化性能 调参
  • (转)fock函数详解
  • (转)树状数组
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码