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

news2024/11/16 1:57:59

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

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

  • 自定义组件:@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 {
  @State
  username: string = "子木"

  //组件什么时候被创建的回调函数
  aboutToAppear() {
    console.info('MychildComponent被创建了')
  }

  //组件被销毁时候执行的回调函数
  aboutToDisappear() {
    console.info('MyChildComponent被销毁了')
  }

  build() {
    Column() {
      Text(`hello${this.username}`)
        .fontSize(50)
        .onClick(() => {
          this.username = "张三"
        })
    }
  }
}

//入口组件(页面)
@Entry
@Component
struct Test8 {
  @State
  isShowChild: 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属性为false
      Button('删除子组件')
        .onClick(() => {
          this.isShowChild = false
        })

      //把当前test8页面隐藏,可以通过跳转到另外一个页面

      Button('跳转其他页面')
        .onClick(() => {
          router.pushUrl({ url: "pages/index.ets" })
        })
    }
  }
}

点击运行预览器之后

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

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

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

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

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

相关文章

海信电视刷机以及简化操作经验介绍

刷机 强制U盘刷机 准备一个U盘,U盘格式化成 FAT32 格式。下载对应的刷机包,将 TargetHis 拷贝到u盘根目录关闭电视电源启动电视,并且不断的按下音量‘-’按键等待刷机就可以了 能开机 能开机的话就1.2一样,进入系统后&#xf…

03. Spring 事务管理

文章目录 1. Spring 事务管理简介2. Transactional 注解属性信息3. Transactional 简单使用4. Transactional 使用注意事项4.1 正确指定事务回滚的异常类型4.1.1 Java 异常继承体系 4.2 Transactional 注解应用在 public 方法或类上才有效4.3 正确设置 Transactional 的 propag…

【Spring】深入理解 Spring 状态机:简化复杂业务逻辑的利器

前言 在软件开发中,有许多场景需要处理状态转换和状态驱动的逻辑,比如订单处理、工作流程管理、游戏引擎等。Spring 状态机(Spring State Machine)是 Spring Framework 提供的一个强大的模块,用于帮助开发人员轻松构建…

【VTKExamples::Utilities】第二期 AnimationScene

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例AnimationScene,并解析VTK中动画的基本框架,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ…

OSCP学习,布置你的Kali Linux

为什么要写这篇文章? 我是一个OSCP学习者,以教促学。同时也能让各位入门的师傅们更好的了解OSCP这门课程。本人文笔不太好,如果有什么写的不对的地方,师傅们多多指正。 参考资料: OSCP 考试电子书 Linux Basics for…

微信小程序毕业设计-跑腿系统项目开发实战(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

深度学习之加宽全连接

1.Functional API 搭建神经网络模型 1.1.利用Functional API编写宽深神经网络模型进行手写数字识别 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.model_selection import train_test_spli…

工程技术SCI期刊,中科院4区,收稿范围非常广泛,审稿快易录用!

一、期刊名称 CMES-Computer Modeling in Engineering & Sciences 二、期刊简介概况 期刊类型:SCI 学科领域:工程技术 影响因子:2.4 中科院分区:4区 三、期刊征稿范围 本期刊在工程与科学的计算机建模领域发表具有合理永…

python中的空语句以及对于条件语句的总结

if条件: 代码块 if条件: 代码块1 else: 代码块2 if条件1: 代码块1 elif条件2: 代码块2 else: 代码块3

2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟

注意开浮点数 ​​​​ import java.util.Scanner;public class Main {static Scanner scnew Scanner(System.in);public static void main(String[] args) {double t0;int cnt0;double distance1000;while(distance>1){//相撞时间tdistance/60.0;distance-t*20;cnt;}Syste…

梭住绿色,植梦WILL来,容声冰箱“节能森林计划”再启航

近日,容声冰箱再度开启了“节能森林计划”绿色公益之旅。 据「TMT星球」了解,此次活动深入到阿拉善荒漠化地带,通过实地考察和亲身体验,见证容声了“节能森林计划”项目的持续落地和实施效果。 2022年,容声冰箱启动了…

IP地址在广告行业中的重要地位

新时代,广告已经成为了企业推广产品的必要手段,而企业想要广告效果好,就要做到精准投放营销广告,将“花钱”的广告精准送到产品的受众用户面前,让收益大于花销,而归根究底就是广告转化率与回报率是否达到预…

Kivy 项目51斩百词 6 播放读音

为了给小喇叭图像绑定点击事件,实现当用户点击按钮时,触发该事件对应的回调方法。 在方法内对于不同的系统Kivy使用不同的播放语音方法, 对于Windows系统 使用SoundLoader播放语音, 对于其他的Unix系统 使用Pyjnjus播放…

PawSQL: 企业级SQL审核工具的新玩家

随着数据库应用在企业中的广泛使用,确保SQL代码质量的重要性日益凸显。现有的SQL审核工具很多,包括Yearning、goInception、Bytebase、爱可生的SQLE、云和恩墨的SQM等等,但是它们或者规则覆盖度、或者是在正确率等方面存在明显不足&#xff1…

Halo Theme AirCloud 主题文档

发现一款简洁的halo主题 Halo Theme AirCloud 主题文档 | LogDicthttps://www.logdict.com/archives/AirCloud

2-Django项目进阶--继续学生管理系统

目录 项目框架: urls.py views.py modules.py class_data.html add_and_modify.html add_stu.html 笔记: 继承语法 模板继承总结: 班级添加 add_and_modify.html 修改添加公用一个页面即可 views.py 班级修改 views.py url.py 班级删除 views.py…

牛客热题:寻找第K大

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:寻找第K大题目链接方法一&#…

面试官:讲讲为什么SpringBoot的 jar 可以直接运行?

Spring Boot 是一个用于简化 Spring 应用程序开发的框架,它通过约定优于配置和大量的自动化配置,使得开发者可以更轻松地创建和部署 Spring 应用程序。一个特别引人注目的特性是 Spring Boot 应用可以打包成一个可执行的 JAR 文件,并且可以直…

基于图鸟UI的圈子商圈:一个全栈前端模板的探索与应用

摘要: 本文介绍了一个基于图鸟UI的纯前端模板——圈子商圈,它支持微信小程序、APP和H5等多平台开发。该模板不仅包含丰富的UI组件和页面模板,还提供了详尽的使用文档,旨在帮助开发者快速构建出酷炫且功能齐全的前端应用。本文将从…

51-54 Sora能制作动作大片还需要一段时间 | DrivingGaussian:周围动态自动驾驶场景的复合高斯飞溅

24年3月,北大、谷歌和加州大学共同发布了DrivingGaussian: Composite Gaussian Splatting for Surrounding Dynamic Autonomous Driving Scenes。视图合成和可控模拟可以生成自动驾驶的极端场景Corner Case,这些安全关键情况有助于以更低成本验证和增强自…