HarmonyOS入门--页面和自定义组件生命周期

文章目录

    • 页面和自定义组件生命周期
      • 页面生命周期
      • 组件生命周期
      • 生命周期的调用时机

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

生命周期流程如下图所示,下图展示的是被@Entry装饰的组件(首页)生命周期。
在这里插入图片描述

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

  • 自定义组件:@Component装饰的UI单元,可以组合多个系统组件实现UI的复用,可以调用组件的生命周期。
  • 页面:即应用的UI页面。可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。只有被@Entry装饰的组件才可以调用页面的生命周期。

页面生命周期

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

  • onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景。
  • onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。
  • onBackPress:当用户点击返回按钮时触发。

组件生命周期

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

  • aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。
  • aboutToDisappear:在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

生命周期的调用时机

// Index.ets
import router from '@ohos.router';@Entry
@Component
struct MyComponent {@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('MyComponent aboutToAppear');}// 组件生命周期aboutToDisappear() {console.info('MyComponent aboutToDisappear');}build() {Column() {// this.showChild为true,创建Child子组件,执行Child aboutToAppearif (this.showChild) {Child()}// this.showChild为false,删除Child子组件,执行Child aboutToDisappearButton('delete Child').onClick(() => {this.showChild = false;})// push到Page2页面,执行onPageHideButton('push to next page').onClick(() => {router.pushUrl({ url: 'pages/Page2' });})}}
}@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页面包含两个自定义组件,
一个是被@Entry装饰的MyComponent,页面的入口组件,即页面的根节点;
一个是Child,是MyComponent的子组件。
只有@Entry装饰的节点才可以使页面级别的生命周期方法生效,所以MyComponent中声明了当前Index页面的页面生命周期函数。


MyComponent和其子组件Child也同时也声明了组件的生命周期函数

  • 应用冷启动的初始化流程为:
    MyComponent aboutToAppear --> MyComponent build --> Child aboutToAppear --> Child build --> Child build执行完毕 --> MyComponent build执行完毕 --> Index onPageShow

  • 删除Child组件,会执行Child aboutToDisappear方法。

  • 调用router.pushUrl接口,跳转到另外一个页面,当前Index页面隐藏,执行页面生命周期Index onPageHide。此处调用的是router.pushUrl接口,Index页面被隐藏,并没有销毁,所以只调用onPageHide。跳转到新页面后,执行初始化新页面的生命周期的流程。

  • 最小化应用或者应用进入后台,触发Index onPageHide。当前Index页面没有被销毁,所以并不会执行组件的aboutToDisappear。应用回到前台,执行Index onPageShow。

  • 如果调用的是router.replaceUrl,则当前Index页面被销毁,执行的生命周期流程将变为:Index onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear。上文已经提到,组件的销毁是从组件树上直接摘下子树,所以先调用父组件的aboutToDisappear,再调用子组件的aboutToDisappear,然后执行初始化新页面的生命周期流程。

  • 点击返回按钮,触发页面生命周期Index onBackPress,且触发返回一个页面后会导致当前Index页面被销毁。

  • 退出应用,执行Index onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear

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

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

相关文章

[flask]http请求//获取请求体数据

import jsonfrom flask import Flask, requestapp Flask(__name__)app.route("/form1", methods["post"]) def form1():"""获取客户端请求的请求体[表单]:return:""""""获取表单数据请求url:&qu…

网络安全卷么?

官方宣传的是对的网络安全现在是朝阳行业,缺口是很大 不过网络安全行业就是需要技术很多的人达不到企业要求才导致人才缺口大 初级的现在有很多的运维人员转网络安全,初级也会慢慢的卷起来,但是岗位多不用怕,以后各大去也都会要网…

Git Fork后的仓库内容和原仓库保持一致

Git Fork后的仓库内容和原仓库保持一致 ①Fork原仓库内容到自己仓库 ②将项目内容下载到本地 ③使用git命令获取原仓库内容,将原仓库的最新内容合并到自己的分支上并推送 下面从第三步开始演示~ 这里以码云上的若依项目为演示项目 ③使用git命令获取原仓库内容 …

基于龙芯2k1000 mips架构ddr调试心得(二)

1、内存控制器概述 龙芯处理器内部集成的内存控制器的设计遵守 DDR2/3 SDRAM 的行业标准(JESD79-2 和 JESD79-3)。在龙芯处理器中,所实现的所有内存读/写操作都遵守 JESD79-2B 及 JESD79-3 的规定。龙芯处理器支持最大 4 个 CS(由…

Spring Transaction 指定事务管理器问题

一,单个数据源,单个事务管理器与Transactional默认事务管理器名称不一致问题 在平时代码中使用声明性事务时,直接在方法上面加注解即可,如下 Transactional(rollbackFor Exception.class) 并没有指定事务管理器,为…

探索直播美颜技术:计算机视觉在美颜SDK开发中的应用

下文,小编将深入探讨美颜技术在计算机视觉领域中的应用,特别是美颜SDK的开发过程,并剖析其技术原理和实现方法。 一、美颜技术的发展 这些算法往往难以满足用户对高质量美颜效果的需求,因此需要更加先进的技术手段来实现。 二、…

map与set容器常见操作详解(含示例代码及注意事项)

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…

LeetCode-热题100:73. 矩阵置零

题目描述 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入: matrix [[1,1,1],[1,0,1],[1,1,1]] 输出: [[1,0,1],[0,0,0],[1,0,1]] 示例 2&…

企微侧边栏开发(内部应用内嵌H5)

一、背景 公司的业务需要用企业微信和客户进行沟通,而客户的个人信息基本都存储在内部CRM系统中,对于销售来说需要一边看企微,一边去内部CRM系统查询,比较麻烦,希望能在企微增加一个侧边栏展示客户的详细信息&#xf…

常见手撕项目C++

常见手撕项目C 设计模式单例模式饿汉模式懒汉模式 设计模式 单例模式 单例模式是一种常用的软件设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。 优点: 资源控制:单例模式能够确保一个类只有一个实…

淘宝订单中的涉及红包检测、优惠券检测方案|工具|API

首先,检测订单红包的核心价值是什么? “红包的本质就是薅平台羊毛:不用怀疑,平台对于这种损害平台利益的行为肯定是最高等级的稽查”。那么,在日常运营中,需要尽可能过滤这类订单。 其次,如何使…

【数据结构 | 图论】如何用链式前向星存图(保姆级教程,详细图解+完整代码)

一、概述 链式前向星是一种用于存储图的数据结构,特别适合于存储稀疏图,它可以有效地存储图的边和节点信息,以及边的权重。 它的主要思想是将每个节点的所有出边存储在一起,通过数组的方式连接(类似静态数组实现链表…

慧天【HTWATER】:水文水动力模型的革命性工具,城市内涝的精准解决方案

城市内涝水文水动力模型介绍 在城市排水防涝规划过程中,水文水动力耦合模型已经成为一种不可或缺的分析工具。在模型建立、城市内涝风险评估、排水系统性能诊断以及海绵城市规划等方面,内涝耦合模型提供了相应的模拟及分析工具: 1.1丰富的数…

前端学习<二>CSS基础——09-CSS案例讲解:博雅互动

前言 CSS已经学了一些基础内容了,我们来讲解一个小案例吧。以博雅互动的官网首页举例。 版心 首页的版心如下: 这里我们要普及一个概念,叫“版心”。版心是页面中主要内容所在的区域。 比如说,网站左上角的logo,设计…

Flutter 开发学习笔记(0):环境配置

文章目录 前言开发需求环境配置运行出现问题我运行也是解决了很久的问题镜像源设置为清华的镜像源(不知道有没有影响)使用JDK21,JDK版本不能低于JDK11手动下载flutter 对应的gradle 运行成功! 前言 我最近一直在用Uniapp写代码&a…

vmware,linux,centos7,NAT模式下的网络配置

centos7的NAT网络配置 NAT模式说明虚拟机网络配置工具本机配置net8网络(NAT的网域)本机的IP配置(用于net8局域网内解析主机IP和域名对应关系使用)(可选)虚拟机内的网络配置虚拟机ping不通www.baidu.com的情况下虚拟机ping可以ping…

ARM64架构栈帧以及帧指针FP

文章目录 前言一、arm64架构寄存器简介1.1 异常等级1.2 通用寄存器1.3 ARM64架构ABI 二、ARM64架构函数调用标准2.1 AArch64过程调用标准简介2.2 通用寄存器中的参数 三、demo分析3.1 main函数3.2 funb3.3 funa 四、栈帧总结五、demo演示参考资料 前言 这篇文章描述了 x86_64架…

智过网:一建36岁好不好找工作?能干什么?

在职业发展的道路上,许多人在不同的年龄阶段都会面临不同的挑战和机遇。对于36岁这一年龄阶段的人来说,如果已经通过了国家一级建造师(一建)的考试,那么他们在找工作方面会有怎样的前景呢?又能从事哪些职业…

气象预测新篇章:Python人工智能的变革力量

Python是功能强大、免费、开源,实现面向对象的编程语言,在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能,这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

20.变量的使用方式和注意事项

文章目录 一、变量的用法二、变量的注意事项三、总结 一、变量的用法 代码示例 public static void main(String[] args) {//1.基本用法// 定义变量,再进行输出int a 10;System.out.println(a);// 10System.out.println(a);// 10//2.变量参与计算int b 30;int c …