首页 > 其他分享 >ArkTs基础语法-声明式UI-页面和自定义组件生命周期

ArkTs基础语法-声明式UI-页面和自定义组件生命周期

时间:2024-08-16 14:27:19浏览次数:8  
标签:ArkTs 生命周期 自定义 UI build 组件 aboutToDisappear 页面

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

组件和页面的关系

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

生命周期

页面生命周期

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

组件生命周期

  • aboutToAppear:组件即将出现时回调该接口,具体时机为创建自定义组件的新实例后,其build()函数执行之前。
  • onDidBuild:组件build()函数执行完成之后回调该接口,不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,可能会导致UI表现不稳定。
  • aboutToDisappear:在组件销毁之前执行,不允许在aboutToDisappear中改变状态变量。

@Entry装饰的组件,即页面的生命周期流程如下图:
在这里插入图片描述

普通流程为:

aboutToAppear --> build --> onDidBuild --> onPageShow --> onPageHide --> aboutToDisappear

页面即将出现–>执行组件build函数–>build完成–>页面显示–>页面隐藏–>组件销毁,即将消失

其他流程:

  • 如果页面有@Entry A,@Component B,B的子组件C,那么生命周期流程为:
    A aboutToAppear --> A build --> A onDidBuild -> B aboutToAppear -> B build -> B onDidBuild -> C aboutToAppear -> C build -> C onDidBuild -> A onPageShow

  • 如果要删除B节点,那么后续生命周期流程为:
    B aboutToDisappear -> C aboutToDisappear

  • 跳转其他页面:

    router.pushUrl: A onPageHide -> 新页面的初始化生命周期
    router.replaceUrl: A onPageHide -> A aboutToDisappear -> B aboutToDisappear -> C aboutToDisappear -> 新页面的初始化生命周期

  • 点击返回按钮:A onBackPress -> A onPageHide -> A aboutToDisappear -> B aboutToDisappear -> C aboutToDisappear

  • 最小化应用或者应用进入后台:A onPageHide

  • 应用回到前台: A onPageShow

  • 退出应用:A onPageHide -> A aboutToDisappear -> B aboutToDisappear -> C aboutToDisappear

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

首次创建

  1. 实例创建:自定义组件的实例由ArkUI框架创建。
  2. 初始化成员变量:通过组件内部默认值或者构造方法传入参数来初始化自定义组件的成员变量,初始化顺序为成员变量的定义顺序。
  3. 如果定义了aboutToAppear函数,则执行aboutToAppear函数。
  4. 首次渲染时,执行build函数,如果子组件为自定义组件,则创建子组件的实例。在首次渲染的过程中,框架会记录状态变量和组件之间的映射关系,后续当状态变量发生变化时,驱动其相关的组件刷新。
  5. 如果定义了onDidBuild函数,则执行onDidBuild函数。
  6. 如果有子组件,那么会执行子组件的上述步骤。

重新渲染

当事件句柄被触发,状态变量发生变化,或者LocalStorage/AppStorage中的属性发生更改,导致绑定的状态变量发生变化时,ArkUI框架观察到了状态变量的变化,会根据初次渲染时,框架内部记录的组件与状态变量之间的关系,以及对应组件的更新函数。执行这些更新函数,实现最小化更新。

自定义组件的删除

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

  1. 组件删除之前,将调用其aboutToDisappear生命周期函数,表示该节点将要被销毁。
  2. 自定义组件和他的变量将被删除,如果有同步的变量,如@Link、@Prop、@StorageLink,将从同步源上取消注册。

AekUI的节点删除机制如下:

- 后端节点直接从组件树上摘下,后端节点被销毁。
- 前端节点解引用,前端节点已经没有引用时,将被JS虚拟机垃圾回收。

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

自定义组件监听页面生命周期

使用无感监听页面路由的能力,能够实现在自定义组件中监听页面的生命周期。

@Component
struct SubComponent {
  listener: (info: uiObserver.RouterPageInfo) => void = (info: uiObserver.RouterPageInfo) => {
    let routerInfo: uiObserver.RouterPageInfo | undefined = this.queryRouterPageInfo();
    if (info.pageId == routerInfo?.pageId) {
      if (info.state == uiObserver.RouterPageState.ON_PAGE_SHOW) {
        console.log(`SubComponent onPageShow`);
      } else if (info.state == uiObserver.RouterPageState.ON_PAGE_HIDE) {
        console.log(`SubComponent onPageHide`);
      }
    }
  }
  aboutToAppear(): void {
    let uiObserver: UIObserver = this.getUIContext().getUIObserver();
    uiObserver.on('routerPageUpdate', this.listener);
  }
  aboutToDisappear(): void {
    let uiObserver: UIObserver = this.getUIContext().getUIObserver();
    uiObserver.off('routerPageUpdate', this.listener);
  }
  build() {
    Column() {
      Text(`SubComponent`)
    }
  }
}

标签:ArkTs,生命周期,自定义,UI,build,组件,aboutToDisappear,页面
From: https://blog.csdn.net/gitzzp/article/details/141256658

相关文章

  • 我是如何使用 vue2+element-ui 处理负责表单,避免单文件过大的问题
    引言在工作中我经常需要处理一些复杂、动态表单,但是随着需求不断迭代,我们也许会发现曾经两三百行的.vue文件现在不知不觉到了两千行,三千行,甚至更多...这对于一个需要长期维护的项目,无疑是增加了很多难度。因此,为了减小文件大小,优化表单组织的结构,我在日常的开发中实践出一种基......
  • 鸿蒙语言ArkTS
    鸿蒙语言ArkTS一.软件布局 可以备份多个ets文件(复制黏贴),但是只执行Index.ets 二.日志文件打印打开预览器就能查看代码运行效果,预览器实时更新(保存就更新)。console.log('说话内容','helloworld')//console.log的语法:console.log('解释',实际内容)会在日志里打印,解释......
  • QuickTime Player 在 Mac / iPad / iPhone 上无法播放 .mp4 视频 bug All In One
    QuickTimePlayer在Mac/iPad/iPhone上无法播放.mp4视频bugAllInOneerrors❌从网上下载的.m3u8(有多个.ts格式的视频片段组合成的)MP4视频,使用Mac/iPad/iPhone自带的QuickTimePlayer都无法正常播放视频bug!要么是没有图像,只有声音;要么是只走进度......
  • 界面控件DevExpress .NET MAUI v24.1 - 发布TreeView等新组件
    DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpressDashboardeXpressApp框架、适用于VisualStudio的CodeRush等一系列辅助工具。屡获大奖的软件开发平台DevExpress今年第一个重要版本v23.1正式发布,该版本拥有众多新产品和数十个具有高影响力......
  • 解锁文本奥秘:NSLinguisticTagger在Objective-C中的语言分析之旅
    标题:解锁文本奥秘:NSLinguisticTagger在Objective-C中的语言分析之旅引言在Objective-C的丰富生态中,NSLinguisticTagger扮演着自然语言处理的重要角色。它提供了一套强大的API,用于对文本进行分词和标注,帮助开发者理解文本的结构和含义。本文将深入探讨NSLinguisticTagger的......
  • gym创建环境、自定义gym环境
    环境:half_cheetah.pyfromosimportpathimportnumpyasnpfromgymnasiumimportutilsfromgymnasium.envs.mujocoimportMujocoEnvfromgymnasium.spacesimportBoxDEFAULT_CAMERA_CONFIG={"distance":4.0,}classMOHalfCheetahEnv(Mujoc......
  • @Scheduled 定时任务自定义
    简介@Scheduled定时任务自定义可以通过SchedulingConfigurer实现。SchedulingConfigurer是SpringFramework中的一个接口,用于配置定时任务。当你需要对定时任务进行更高级别的定制时,这个接口就显得非常有用。可以通过SchedulingConfigurer接口来自定义一些高级配置可以......
  • 在 Vue 自定义事件中,父组件如何接收子组件传递的多个参数?
    在Vue中,自定义事件是父组件和子组件之间通信的重要方式。父组件可以监听子组件的事件,子组件则通过触发自定义事件将数据传递给父组件。如果子组件需要向父组件传递多个参数。 $emit 方法使用一、场景介绍假设我们有一个父组件和一个子组件。子组件需要通过自定义事件向父组......
  • MFC自定义按钮实现
    MFC中要实现自定义按钮,首先要创建一个类并继承自CButton。我这里创建的类名为CMainButtonclassCMainButton:publicCButton{ DECLARE_DYNAMIC(CMainButton)public: CMainButton(UINTnID,CRectrcWnd,CWnd*pParent=nullptr);//nID为按钮ID,rcWnd为按钮位置 virtual~CM......
  • C语言学习笔记 Day13(复合类型/自定义类型)
    Day13 内容梳理:目录Chapter9 复合类型(自定义类型)9.1结构体(1)结构体变量定义、初始化(2)嵌套结构体(3)结构体赋值(4)结构体和指针(5)结构体做函数参数9.2共用体(联合体)9.3枚举9.4typedef关键字Chapter9 复合类型(自定义类型)9.1结构体有时需要将不同类型的数组......