容器组件:页面和自定义组件生命周期(HarmonyOS学习第五课)

页面和自定义组件生命周期

先明确自定义组件和页面的关系:

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

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

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

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

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

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

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

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

  • 生命周期流程如下图所示,下图展示的是被@Entry装饰的组件(首页)生命周期。

 

需要注意的是,部分生命周期回调函数仅对@Entry修的自定义组件生效,它们分别是:onpageShow、onpageHide、onBackpress。根据上面的流程图,我们从自定义组件的初始创建、重新渲染和删除来详细解释。

自定义组件的创建和渲染流程

  1. 自定义组件的创建:自定义组件的实例由ArkuI框架创建。

  2. 初始化自定义组件的成员变量:通过本地默认值或者构造方法传递参数来初始化自定义组件的成员变量,初始化顺序为成员变量的定义顺序。

  3. 如果开发者定义了 aboutToAppear,则执行 aboutToappear 方法。

  4. 在首次渲染的时候,执行build方法染系统组件,如果子组件为自定义组件,则创建自定义组件的实例。在执行build()函数的过程中,框架会观察每个状态变量的读取状态,将保存两个map

a.状态变量->UI组件(包括ForEach和if)。 ​ b.UI 组件 ->此组件的更新函数,即一个 lambda 方法,作为 build()函数的子集,创建对应的UI组件并执行其属性方法,示意如下。

当应用在后台启动时,此时应用进程并没有销毁,所以仅需要执行enpageshow

自定义组件重新渲染

当事件句柄被触发(比如设置了点击事件,即触发点击事件)改变了状态变量时,或晋Localstorage/appStorage 中的属性更改,并导致绑定的状态变量更改其值时:

  1. 框架观察到了变化,将启动重新渲染。

  2. 根据框架持有的两个map(自定义组件的创建和渲染流程中第4步),框架可以知道该状态变量管理了哪些UI组件,以及这些UI组件对应的更新函数。执行这些UI 组件的更新函数,实现最小化更新。

自定义组件的删除

如果if组件的分支改变,或者ForEach 循环渲染中数组的个数改变,组件将被删除

  1. 在删除组件之前,将调用其aboutToDisappear生命周期函数,标记该节点将要被销毁。ArkUI的节点删除机制是:后端节点直接从组件树上摘下,后端节点被销毁,对前端节点解引用,当前端节点已经没有引用时,将被JS虚拟机垃圾回收。

  2. 自定义组件和它的变量将被删除,如果其有同步的变量,比如@Link、@Prop、@StorageLink,将从同步源上取消注册。

不建议在生命周期 aboutToDisappear内使用async await,如果在生命周期的aboutToDisappear使用异步操作(Promise或者回调方法),自定义组件将被保留在Promise的闭包中,直到回调方法被执行完,这个行为阻止了自定义组件的垃圾回收

aboutToAppear( )函数

探究组件什么时候被创建的回调函数

aboutToDisAppear( )函数

探究组件什么时候被销毁的回调函数

onPageShow( )函数

在组件显示的时候自动进行回调

onpageHide( )函数

在组件隐藏的时候自动进行回调

onBackPress( )函数

在按钮被点击的时候进行回调

示例代码:

//自定义组件
import FaultLogger from '@ohos.faultLogger'
import router from '@ohos.router'@Component
struct MyChildComponent {@Stateusername: string = "子木"//组件什么时候被创建的回调函数aboutToAppear() {console.info('MychildComponent被创建了')}//组件被销毁时候执行的回调函数aboutToDisappear() {console.info('MyChildComponent被销毁了')}build() {Column() {Text(`hello${this.username}`).fontSize(50).onClick(() => {this.username = "张三"})}}
}//入口组件(页面)
@Entry
@Component
struct Test8 {@StateisShowChild: boolean = true //是否显示自定义组件//组件什么时候被创建的回调函数aboutToAppear() {console.info('test8被创建了')}//组件被销毁时候执行的回调函数aboutToDisappear() {console.info('test8被销毁了')}//在页面显示的时候自动进行回调onPageShow() {console.info('test8页面显示了')}//在页面隐藏的时候自动进行回调onPageHide() {console.info('test8隐藏了')}//返回按钮被点击onBackPress() {console.info('test8返回按钮点击了')}build() {Column() {Text(`我的主页面test8`).fontSize(40).fontWeight(FontWeight.Bold)//自定义组件if (this.isShowChild) {MyChildComponent()}//点击一个按钮改变 isShowChild属性为falseButton('删除子组件').onClick(() => {this.isShowChild = false})//把当前test8页面隐藏,可以通过跳转到另外一个页面Button('跳转其他页面').onClick(() => {router.pushUrl({ url: "pages/index.ets" })})}}
}

点击运行预览器之后

还没有进行点击操作我们就可以看到

 当我点击删除子组件的时候

当我们点击 跳转到其他页面 通过设置路由即可显示,并且触发onpageHide( )隐藏函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/333214.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5月26(信息差)

🌍 珠峰登顶“堵车”后冰架断裂 5人坠崖 2人没爬上来! 珠峰登顶“堵车”后冰架断裂 5人坠崖 2人没爬上来! 🎄 Windows 11 Beta 22635.3646 预览版发布:中国大陆地区新增“微软电脑管家”应用 ✨ 成都限购解除即将满…

DOS学习-目录与文件应用操作经典案例-ren

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 案例 1:重命名当前目录下的文件 案例 2&#xff1a…

Postman快捷功能-快速填写请求头

大家好,之前给大家分享关于 Postman 工具的基础使用,今天给大家介绍一个快捷功能,可以一定程度提高我们使用 Postman 工具的效率,在我们进行接口测试时,几乎每个接口都需要填写 Headers,且 Headers 中的参数…

【leetcode面试经典150题】-80. 删除有序数组中的重复项 II

【leetcode面试经典150题】-80. 删除有序数组中的重复项 II 1 题目介绍2 个人解题思路2.1 代码2.2 思路 3 官方题解 1 题目介绍 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组…

一键接入大模型:One-Api本地安装配置实操,POSTMAN、APIFOX调用CURL

前言 最近准备学习一下 Semantic Kernel, OpenAI 的 Api 申请麻烦,所以想通过 One-api 对接一下国内的在线大模型,先熟悉一下 Semantic Kernel 的基本用法,本篇文章重点记录一下OneApi安装配置的过程。 讯飞星火有 3.5 模型的 200w 个人免费 token,可以拿来学习。 讯飞星…

推导2维镜像变换(Reflection Transform)的公式

我们知道2维的旋转变换公式为 Q ( cos ⁡ ( θ ) sin ⁡ ( θ ) − sin ⁡ ( θ ) cos ⁡ ( θ ) ) Q\left( \begin{matrix} \cos \left( \theta \right)& \sin \left( \theta \right)\\ -\sin \left( \theta \right)& \cos \left( \theta \right)\\ \end{matrix} \r…

UTF-8格式大统一:转码高效指南,彻底解决文件编码乱码问题!

文章目录 1 背景说明2 统一的好处3 对增量代码怎么进行统一4 对存量代码怎么进行统一4.1 指定单一文件夹,对里面的 .h .cpp 文件全转换4.2 指定单一文件夹,对里面的.h .cpp文件按需转换4.3 指定多文件夹,对里面的.h .cpp文件全部转换4.4 指定…

用数据,简单点!奇点云2024 StartDT Day数智科技大会,直播见

在充满挑战的2024,企业如何以最小化的资源投入和试错成本,挖掘新的增长机会,实现确定性发展? “简单点”是当前商业环境的应对策略,也是奇点云2024 StartDT Day的核心理念。 5月28日,由奇点云主办的2024 S…

RPA机器人流程自动化如何优化人力资源工作流程

人力资源部门在支持员工和改善整体工作环节方面扮演着至关重要的角色,但是在人资管理的日常工作中,充斥着大量基于规则的重复性任务,例如简历筛选、面试安排、员工数据管理、培训管理、绩效管理等,这些任务通常需要工作人员花费大…

Hive课程文档

基本语法 库操作 Hive和MySQL类似,提供了针对database的操作。 1)创建库: create database demo; 注意,每一个database在HDFS上都会对应一个目录,如果不指定,那么默认是放在/user/hive/warehouse/下。在Hive中&am…

消息回复及时,客户不流失!这个微信自动回复设置快快码住!

你是不是也遇到过由于回复不及时,导致客户流失的情况发生?或是好友申请太多,来不及通过? 别担心,试试个微管理系统,让你实现自动回复,提高回复效率! 1、自动通过好友 当有新的好友…

5.23 Linux中超时检测方式+模拟面试

1.IO多路复用的原理? IO多路复用使得一个或少量线程资源处理多个连接的IO事件的技术。对于要处理的多个阻塞的IO操作,建立集合并存储它们的文件描述符,利用单个阻塞函数去监控集合中文件描述符事件到达的情况,(如果到…

Python 全栈体系【四阶】(五十三)

第五章 深度学习 十二、光学字符识别(OCR) 2. 文字检测技术 2.3 DB(2020) DB全称是Differentiable Binarization(可微分二值化),是近年提出的利用图像分割方法进行文字检测的模型。前文所提…

如何评价 OpenAI 最新发布支持实时语音对话的模型GPT-4o?OpenAI发完GTP-4o,国内大模型行业还有哪些机会?

文章目录 OpenAI发完GTP-4o,国内大模型行业还有哪些机会?详细了解一下OpenAI最新发布的支持实时语音对话的模型GPT-4o国内大模型如何寻找发展机会?想要发展技术必须要创新与追赶或许应用场景拓展也是一种出路产业生态构建 ChatGPT 问世才 17 …

网络安全之重发布与路由策略详解

重发布;import (路由导入) 将不同方式(直连、静态、缺省、其他协议)的路由器重发布进入RIP,OSPF中。 注意:1、华为中不能将缺省路由重发布进入RUO协议(思科也是一样)。…

DrugBank数据库的功能与使用

众所周知的是DrugBank数据库有两个主要辅助角色: ①临床导向的药品知识。DrugBank提供关于药品靶点和药物作用的生物或生理结果的详细、最新、定量分析或分子量的信息。 ②化学导向的药品数据库。提供计算机检索药物、药物“复原”、计算机检索药物结构数据、药物…

二叉树——堆的实现

一.前言 前面我们讲解了二叉树的概念以及二叉树的存储结构:https://blog.csdn.net/yiqingaa/article/details/139224974?spm1001.2014.3001.5502 今天我们主要讲讲二叉树的存储结构,以及堆的实现。 二.正文 1.二叉树的顺序结构及实现 1.1二叉树的顺序…

9. C++通过epoll+fork的方式实现高性能网络服务器

epollfork 实现高性能网络服务器 一般在服务器上,CPU是多核的,上述epoll实现方式只使用了其中的一个核,造成了资源的大量浪费。因此我们可以将epoll和fork结合来实现更高性能的网络服务器。 创建子进程函数–fork( ) 要了解线程我们先来了解…

聊天软件鼻祖 ICQ 将于 6 月 26 日关闭;40 光年外发现一颗潜在宜居的类地行星丨 RTE 开发者日报 Vol.212

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

就业班 第三阶段(ELK) 2401--5.22 day3 filebeat+elk云部署

kafka集群 Windterm同步输入,多台机子可以同时输入同步输入 启动kafka需要启动两个 第一个 [rootkafka1 ~]# cd /usr/local/kafka_2.11-2.0.0/ [rootkafka1 ~]# nohup bin/zookeeper-server-start.sh config/zookeeper.properties &第二个 [rootkafka1 ~]#…