`
龙儿筝
  • 浏览: 18231 次
社区版块
存档分类
最新评论

鸿蒙自定义组件生命周期

阅读更多

在开始之前,我们先明确自定义组件和页面的关系:

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

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

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

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

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

生命周期流程如下图所示,下图展示的是被@Entry装饰的组件(页面)生命周期。
img1
以下示例展示了生命周期的调用时机:

// 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)。

  • 应用冷启动的初始化流程为:MyComponent aboutToAppear --> MyComponent build --> MyComponent onDidBuild--> Child aboutToAppear --> Child build --> Child onDidBuild --> Index onPageShow。
  • 点击“delete Child”,if绑定的this.showChild变成false,删除Child组件,会执行Child aboutToDisappear方法。
  • 点击“push to next page”,调用router.pushUrl接口,跳转到另外一个页面,当前Index页面隐藏,执行页面生命周期Index onPageHide。此处调用的是router.pushUrl接口,Index页面被隐藏,并没有销毁,所以只调用onPageHide。跳转到新页面后,执行初始化新页面的生命周期的流程。
  • 如果调用的是router.replaceUrl,则当前Index页面被销毁,执行的生命周期流程将变为:Index onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear。上文已经提到,组件的销毁是从组件树上直接摘下子树,所以先调用父组件的aboutToDisappear,再调用子组件的aboutToDisappear,然后执行初始化新页面的生命周期流程。
  • 点击返回按钮,触发页面生命周期Index onBackPress,且触发返回一个页面后会导致当前Index页面被销毁。
  • 最小化应用或者应用进入后台,触发Index onPageHide。当前Index页面没有被销毁,所以并不会执行组件的aboutToDisappear。应用回到前台,执行Index onPageShow。
  • 退出应用,执行Index onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear。
0
0
分享到:
评论

相关推荐

    【OpenHarmony】ArkTS 语法基础 ③ ( 自定义组件生命周期回调函数 - 页面生命周期回调函数 )

    【OpenHarmony】ArkTS 语法基础 ③ ( @Component 自定义组件生命周期回调函数 | @Entry 页面生命周期回调函数 ) https://hanshuliang.blog.csdn.net/article/details/139424435 博客源码快照 一、ArkTS @Component ...

    鸿蒙Web组件使用示例Demo

    【鸿蒙Web组件使用示例Demo】是基于HarmonyOS操作系统的一个开发项目,它展示了如何在ArkTS API9版本中利用Stage模式来有效地构建和管理Web组件。HarmonyOS是华为推出的面向全场景的分布式操作系统,旨在提供跨平台...

    基于HarmonyOS 4开发的一款新闻类的鸿蒙APP源代码

    7. **生命周期管理**:了解组件的生命周期对优化性能至关重要,例如在合适的时机释放资源,防止内存泄漏。 8. **多设备适配**:HarmonyOS 的目标是跨平台运行,所以源码会包含如何设计适应不同屏幕尺寸和硬件设备的...

    <HarmonyOS第一课>学习路径2.ArkTS开发语言介绍 试题及答案

    &lt;HarmonyOS第一课&gt;学习路径2.ArkTS开发语言介绍 习题及答案【习题】ArkTS基础知识 及格分85...下面哪些函数是自定义组件的生命周期函数?A. aboutToAppearB. aboutToDisappearC. onPageShowD. onPageHideE. onBackPress

    1-HarmonyOS通讯录开发实验详细操作手册(J.pdf

    8. 页面生命周期以及页面之间跳转与传参 9. 自定义组件(同时涉及到 Canvas)以及如何调用 10. 数据存储操作,主要涉及 sqlite 数据库存储 11. 代码编程规范、设计模式 实验过程分解与实验目标对应矩阵: | 实验...

    HarmonyOS JS UI框架简介1

    - **前端框架层 (Framework)**:负责前端页面解析,提供MVVM开发模式、页面路由和自定义组件等功能。 - **引擎层 (Engine)**:包含动画解析、DOM树构建、布局计算、渲染命令构建与绘制及事件管理等功能。 - **...

    HarmonyOS JS UI前端开发

    应用层是开发者创建的JS FA应用,前端框架层提供MVVM模式、页面路由和自定义组件等功能,引擎层处理动画、DOM操作和事件管理,适配层则负责与系统平台的接口对接。 6. **AceAbility**:AceAbility是JS FA在Harmony...

    ArkTS基础知识源码

    HarmonyOs开发,ArkTs基础知识介绍,声明式范式,ArkUi范式。 声明式语法和组件化基础知识,搭建一个可刷新的排行榜页面。...最后我们点击系统返回按键,来学习自定义组件生命周期函数。完成效果如图所示:

    HCIA-HarmonyOS Application Developer V1.0 学员用书.pdf

    应用权限管理是确保HarmonyOS应用安全运行的关键,包括权限声明、动态申请敏感权限、自定义权限以及权限保护方法。权限使用原则是指导开发者合理使用权限,保护用户隐私和数据安全。 知识点七:应用隐私保护 应用...

    openHarmonyJS鸿蒙前端开发基础教程PPT.pptx

    应用生命周期组件与组件通信是OpenHarmony应用层的重要组件之一,包括chart组件、自定义组件、父组件通过props向子组件传值、slot插槽分发等。 八、路由与网络请求 路由与网络请求是OpenHarmony应用层的重要组件之...

    harmonyos英文怎么读-harmonyos-examples:一系列的鸿蒙OS示例

    3. **组件化开发**:HarmonyOS提供了丰富的UI组件,开发者可以了解如何组合和自定义这些组件来创建用户界面。 4. **服务发现与调用**:HarmonyOS支持服务发现和调用,使得应用能够动态发现并使用其他设备上的服务,...

    HarmonyOS平台上一些好看的加载动画集合

    例如,使用矢量图避免因放大而失真,减少不必要的计算,合理管理资源生命周期。 6. **API 设计**:为了让开发者易于使用,加载动画库通常会提供简洁明了的 API 接口,如 `start()`、`stop()` 和 `hide()` 等方法,...

    鸿蒙轮播图banner.7z

    在鸿蒙OS(HarmonyOs)开发中,创建一个轮播图Banner是常见的需求,用于展示广告、推荐内容等。本教程将详细讲解如何在鸿蒙系统中实现一个简单的轮播图组件,以便用户能够流畅地浏览并切换不同的图片或内容。 首先...

    ReactNative之WebView之解决updateNavigationState不能准确回调

    3. **生命周期问题**:在React组件的生命周期中,如果`WebView`的生命周期管理不当,可能会影响`updateNavigationState`的调用。 4. **异步问题**:JavaScript和原生代码之间的通信是异步的,如果处理不当,可能会...

    HarmonyOS应用开发-JS相关整体梳理.docx

    ### HarmonyOS应用开发-JS相关整体梳理 #### 方舟开发框架概述 方舟开发框架是华为为HarmonyOS设计的一款跨设备的高性能UI开发框架,它支持声明式编程及跨设备多态UI的设计理念,旨在简化开发者的开发过程并提高...

    零基础开始学习鸿蒙开发-@State的使用以及定义

    `@State` 装饰器就是用于声明组件内部状态的一种机制,它可以使得状态值能够在组件的生命周期内被改变并自动触发组件的重渲染,以更新用户界面。 一、`@State` 的定义 `@State` 是HarmonyOS SDK提供的注解...

    TYUT移动框架(HarmonyOS应用开发)实验指导书

    - 掌握Ability的生命周期管理。 - 学习如何在Ability之间实现页面跳转与数据传递。 - 使用AbilityContext启动其他Ability,并利用Want进行参数传递。 **2.3 实验内容** - **任务一:实现页面间的跳转** - 实现从...

    CircleIndicatorComponent.7z

    标题“CircleIndicatorComponent.7z”暗示了一个专注于自定义PageSlider圆点指示器的组件库,它适用于HarmonyOS应用程序。这种指示器通常用于展示ViewPager的当前页面状态,为用户提供直观的导航反馈。 描述中提到...

    鸿蒙卡片开发示例代码.zip

    鸿蒙卡片(HarmonyOS Cards)是华为鸿蒙操作系统中的一种重要交互元素,它旨在提供简洁、高效的信息展示和操作体验。在这个名为“鸿蒙卡片开发示例代码.zip”的压缩包中,包含了一个名为"MyCard"的文件,我们可以...

    基于鸿蒙手机应用开发的服务卡片案例.rar

    总的来说,开发鸿蒙手机应用中的服务卡片,需要熟练掌握HarmonyOS的开发环境和API,理解服务卡片的原理和生命周期,以及如何与系统服务和数据源进行有效交互。通过`FACardProject2`这个项目,开发者可以深入学习并...

Global site tag (gtag.js) - Google Analytics