首页 > 其他分享 >鸿蒙开发项目中你是怎么理解生命周期?你知道的生命周期函数有那些, 说一下执行时机?(页面和自定义组件生命周期)

鸿蒙开发项目中你是怎么理解生命周期?你知道的生命周期函数有那些, 说一下执行时机?(页面和自定义组件生命周期)

时间:2024-09-21 19:20:05浏览次数:8  
标签:生命周期 自定义 周期函数 Child 组件 Entry 页面

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

#一、怎么理解生命周期?


生命周期:简单点理解就是从创建到销毁的过程

#二、你知道的生命周期函数有那些, 说一下执行时机?

自定义组件:@Component装饰的UI单元,可以组合多个系统组件实现UI的复用,可以调用组件的生命周期。

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

##组件周期

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


aboutToAppear(组件加载的时候触发)


● aboutToAppear 函数在创建自定义组件的新实例后,在执行其 build 函数之前执行。
● 允许在 aboutToAppear 函数中改变状态变量,更改将在后续执行 build 函数中生效。


aboutToDisappear(组件销毁触发)


● aboutToDisappear 函数在自定义组件析构销毁之前执行。
● 不允许在 aboutToDisappear 函数中改变状态变量,特别是 @Link 变量的修改可能会导致应用程序行为不稳定。


##页面周期

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


onPageShow(页面显示执行  可以执行多次)


● 页面每次显示时触发一次,包括路由过程、应用进入前后台等场景,仅 @Entry 修饰的自定义组件生效。


onPageHide(页面显示隐藏  可以执行多次)


● 页面每次隐藏时触发一次,包括路由过程、应用进入前后台等场景,仅 @Entry 修饰的自定义组件生效。


onBackPress(阻止是跳转后阻止)


● 当用户点击返回按钮时触发,仅 @Entry 修饰的自定义组件生效。
● 内部如果返回 true,就无法通过返回键返回上一页,用户就必须和页面交互才可以返回


因为@Entry 也是@Component组件,所以页面组件同时拥有自定义组件的生命周期

#三、以下示例展示了生命周期的调用时机:

// Index.ets
import { router } from '@kit.ArkUI';

@Entry
@Component
struct MyComponent {
  @State showChild: boolean = true;
  @State btnColor:string = "#FF007DFF";

  // 只有被@Entry装饰的组件才可以调用页面的生命周期
  onPageShow() {
    console.info('Index onPageShow');
  }
  // 只有被@Entry装饰的组件才可以调用页面的生命周期
  onPageHide() {
    console.info('Index onPageHide');
  }

  // 只有被@Entry装饰的组件才可以调用页面的生命周期
  onBackPress() {
    console.info('Index onBackPress');
    this.btnColor ="#FFEE0606";
    return true // 返回true表示页面自己处理返回逻辑,不进行页面路由;返回false表示使用默认的路由返回逻辑,不设置返回值按照false处理
  }

  // 组件生命周期
  aboutToAppear() {
    console.info('MyComponent aboutToAppear');
  }

  // 组件生命周期
  onDidBuild() {
    console.info('MyComponent onDidBuild');
  }

  // 组件生命周期
  aboutToDisappear() {
    console.info('MyComponent aboutToDisappear');
  }

  build() {
    Column() {
      // this.showChild为true,创建Child子组件,执行Child aboutToAppear
      if (this.showChild) {
        Child()
      }
      // this.showChild为false,删除Child子组件,执行Child aboutToDisappear
      Button('delete Child')
      .margin(20)
      .backgroundColor(this.btnColor)
      .onClick(() => {
        this.showChild = false;
      })
      // push到page页面,执行onPageHide
      Button('push to next page')
        .onClick(() => {
          router.pushUrl({ url: 'pages/page' });
        })
    }

  }
}

@Component
struct Child {
  @State title: string = 'Hello World';
  // 组件生命周期
  aboutToDisappear() {
    console.info('[lifeCycle] Child aboutToDisappear')
  }

  // 组件生命周期
  onDidBuild() {
    console.info('[lifeCycle] Child onDidBuild');
  }

  // 组件生命周期
  aboutToAppear() {
    console.info('[lifeCycle] Child aboutToAppear')
  }

  build() {
    Text(this.title)
      .fontSize(50)
      .margin(20)
      .onClick(() => {
        this.title = 'Hello ArkUI';
      })
  }
}

// page.ets
@Entry
@Component
struct page {
  @State textColor: Color = Color.Black;
  @State num: number = 0;

  onPageShow() {
    this.num = 5;
  }

  onPageHide() {
    console.log("page onPageHide");
  }

  onBackPress() { // 不设置返回值按照false处理
    this.textColor = Color.Grey;
    this.num = 0;
  }

  aboutToAppear() {
    this.textColor = Color.Blue;
  }

  build() {
    Column() {
      Text(`num 的值为:${this.num}`)
        .fontSize(30)
        .fontWeight(FontWeight.Bold)
        .fontColor(this.textColor)
        .margin(20)
        .onClick(() => {
          this.num += 5;
        })
    }
    .width('100%')
  }
}

以上示例中,Index页面包含两个自定义组件,一个是被@Entry装饰的MyComponent,也是页面的入口组件,即页面的根节点;一个是Child,是MyComponent的子组件。只有@Entry装饰的节点才可以使页面级别的生命周期方法生效,因此在MyComponent中声明当前Index页面的页面生命周期函数(onPageShow / onPageHide / onBackPress)。MyComponent和其子组件Child分别声明了各自的组件级别生命周期函数(aboutToAppear / onDidBuild/aboutToDisappear)。

标签:生命周期,自定义,周期函数,Child,组件,Entry,页面
From: https://blog.csdn.net/H1453571548/article/details/142166153

相关文章

  • view-ui-plus iView Vue 3 table 自定义输入筛选条件
    使用自定义表格头实现筛选:为何和如何在使用view-ui-plus(iView的Vue3版本)时,发现原生的表格组件不支持自定义输入筛选条件为什么要使用自定义表格头?原生组件的限制view-ui-plus的表格组件提供了基本的功能,但在原生实现中,对于复杂的筛选条件或输入框的支持较为有限。......
  • 【服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里
    文章目录一、阿里云OSS对象存储服务介绍二、服务开通与使用准备1、准备工作2、开通OSS云服务(新用户免费使用三个月)3、创建存储空间bucket4、创建并保存Accesskey5、配置访问凭证AK&SK(系统环境变量)三、阿里云OSS使用步骤1、导入依赖坐标2、文件上传Demo快速入门3、阿里......
  • 自定义类型:联合和枚举
    一.联合体类型的声明像结构体一样,联合体也是有一个或者多个成员构成,这些成员可以是不同的类型。但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体。给联合体其中一个成员赋值,其他成员的值也跟着变化。#include......
  • 优化数据库结构:自定义元数据、索引与约束的应用
       当在导入预设表结构时,确实可以自定义一些额外的元数据来优化数据库结构。这些元数据不仅限于表的注释,还包括索引、约束等,这些都是为了提高查询性能、保证数据完整性和便于数据库管理而设计的。表注释表注释是用来描述表的作用、存储的数据类型等信息的文本信息。这......
  • 自定义类型:联合和枚举
    一,联合体类型的声明 与结构体相似,联合体也是由一个或者多个成员构成,这些成员可以是不同类型。但是与结构体不同的是:编译器只为联合体成员中的最大成员分配足够的内存空间。 联合体的特点是所有成员共用一块内存空间。所以联合体也称 ===>  共用体那也就意味着联......
  • 自定义类型:结构体
    一,结构体类型的声明 1.1结构体回顾结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量 1.2结构的声明structtag{        member-list;                         ......
  • Android 他人开源库自定义imageview实现图片圆角,操作简单
    Android他人开源库自定义imageview实现图片圆角,操作简单效果图:1.导入依赖dependencies{implementation'io.github.FlyJingFish:ShapeImageView:1.5.6'}2.ShapeImageView示例<com.flyjingfish.shapeimageviewlib.ShapeImageViewandroid:id="@+id/i......
  • Spring框架bean的生命周期
    在Spring框架中,Bean的生命周期是指一个Spring容器中Bean从创建到销毁的整个过程。Spring容器负责管理Bean的生命周期,它通过依赖注入和面向切面的编程(AOP)为开发者简化了许多繁琐的操作。Spring框架提供了许多钩子方法,允许开发者在特定阶段执行自定义的逻辑。Bean的生命周期大致可......
  • 生命周期
    Vue生命周期Vue的生命周期是指Vue实例从创建到销毁的过程,它包括了一系列的阶段,每个阶段都有特定的钩子函数(LifecycleHooks),可以在这些钩子函数中添加自己的代码,以实现不同的功能。Vue的生命周期可以分为四个主要阶段:创建阶段、挂载阶段、更新阶段和销毁阶段。创建阶段在创建阶......
  • 基于三维地籍的全生命周期“一码管地”
    随着国土空间治理现代化的不断推进,如何实现土地资源的高效管理和利用,成为了一个重要课题。今天,我们将探讨一种创新的土地管理模式——基于三维地籍的全生命周期“一码管地”。一、土地管理面临的挑战传统的土地管理模式存在信息孤岛、管理效率低下、监管难度大等......