ToB企服应用市场:ToB评测及商务社交产业平台

标题: HarmonyOS(五)—— 认识页面和自界说组件生命周期 [打印本页]

作者: 农妇山泉一亩田    时间: 2024-12-25 03:22
标题: HarmonyOS(五)—— 认识页面和自界说组件生命周期
媒介

在前面我们通过怎样创建自界说组件一文知道了怎样怎样自界说组件以及自界说组件的相干注意事项,接下来我们认识一下页面和自界说组件生命周期。
自界说组件和页面的关系

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

生命周期

下面依次先容页面和组件的生命周期函数。
1:页面生命周期

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

  1. onPageShow?(): void
复制代码
页面每次表现时触发一次,包括路由过程、应用进入前台等场景,仅@Entry装饰的自界说组件生效。

  1. onPageHide?(): void
复制代码
页面每次隐蔽时触发一次,包括路由过程、应用进入前后台等场景,仅@Entry装饰的自界说组件生效。

  1. onBackPress?(): void
复制代码
当用户点击返回按钮时触发,仅@Entry装饰的自界说组件生效。
onPageShow,onPageHide,onBackPress生命周期简单利用列子如下:
  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct IndexComponent {
  5.   @State textColor: Color = Color.Black;
  6.   onPageShow() {
  7.     this.textColor = Color.Blue;
  8.     console.info('IndexComponent onPageShow');
  9.   }
  10.   onPageHide() {
  11.     this.textColor = Color.Transparent;
  12.     console.info('IndexComponent onPageHide');
  13.   }
  14.   onBackPress() {
  15.     this.textColor = Color.Red;
  16.     console.info('IndexComponent onBackPress');
  17.   }
  18.   build() {
  19.     Column() {
  20.       Text('Hello World')
  21.         .fontColor(this.textColor)
  22.         .fontSize(30)
  23.         .margin(30)
  24.     }.width('100%')
  25.   }
  26. }
复制代码
2:组件生命周期

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

  1. aboutToAppear?(): void
复制代码
aboutToAppear函数在创建自界说组件的新实例后,在执行其build()函数之前执行。允许在aboutToAppear函数中改变状态变量,更改将在后续执行build()函数中生效。
   注意⚠️:从API version 9开始,该接口支持在ArkTS卡片中利用。
  
  1. aboutToDisappear?(): void
复制代码
aboutToDisappear函数在自界说组件析构烧毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特殊是@Link变量的修改大概会导致应用步伐活动不稳定。
   注意⚠️:从API version 9开始,该接口支持在ArkTS卡片中利用。
  生命周期流程如下图所示,下图展示的是被@Entry装饰的组件生命周期。

根据上面的流程图,我们从自界说组件的初始创建、重新渲染和删除来具体表明。
自界说组件的创建和渲染流程

a: 状态变量 -> UI组件(包括ForEach和if)。
b: UI组件 -> 此组件的更新函数,即一个lambda方法,作为build()函数的子集,创建对应的UI组件并执行其属性方法,示意如下。
  1. build() {
  2.   ...
  3.   this.observeComponentCreation(() => {
  4.     Button.create();
  5.   })
  6.   this.observeComponentCreation(() => {
  7.     Text.create();
  8.   })
  9.   ...
  10. }
复制代码
当应用在后台启动时,此时应用进程并没有烧毁,以是仅需要执行onPageShow。
自界说组件重新渲染

当事件句柄被触发(比如设置了点击事件,即触发点击事件)改变了状态变量时,或者LocalStorage / AppStorage中的属性更改,并导致绑定的状态变量更改其值时:
自界说组件的删除

如果if组件的分支改变,或者ForEach循环渲染中数组的个数改变,组件将被删除:
不建议在生命周期aboutToDisappear内利用async await,如果在生命周期的aboutToDisappear利用异步操作(Promise或者回调方法),自界说组件将被保留在Promise的闭包中,直到回调方法被执行完,这个活动阻止了自界说组件的垃圾接纳。
以下示例展示了生命周期的调用时机:
  1. // Index.ets
  2. import router from '@ohos.router';
  3. @Entry
  4. @Component
  5. struct MyComponent {
  6.   @State showChild: boolean = true;
  7.   // 只有被@Entry装饰的组件才可以调用页面的生命周期
  8.   onPageShow() {
  9.     console.info('Index onPageShow');
  10.   }
  11.   // 只有被@Entry装饰的组件才可以调用页面的生命周期
  12.   onPageHide() {
  13.     console.info('Index onPageHide');
  14.   }
  15.   // 只有被@Entry装饰的组件才可以调用页面的生命周期
  16.   onBackPress() {
  17.     console.info('Index onBackPress');
  18.   }
  19.   // 组件生命周期
  20.   aboutToAppear() {
  21.     console.info('MyComponent aboutToAppear');
  22.   }
  23.   // 组件生命周期
  24.   aboutToDisappear() {
  25.     console.info('MyComponent aboutToDisappear');
  26.   }
  27.   build() {
  28.     Column() {
  29.       // this.showChild为true,创建Child子组件,执行Child aboutToAppear
  30.       if (this.showChild) {
  31.         Child()
  32.       }
  33.       // this.showChild为false,删除Child子组件,执行Child aboutToDisappear
  34.       Button('create or delete Child').onClick(() => {
  35.         this.showChild = false;
  36.       })
  37.       // push到Page2页面,执行onPageHide
  38.       Button('push to next page')
  39.         .onClick(() => {
  40.           router.pushUrl({ url: 'pages/Page2' });
  41.         })
  42.     }
  43.   }
  44. }
  45. @Component
  46. struct Child {
  47.   @State title: string = 'Hello World';
  48.   // 组件生命周期
  49.   aboutToDisappear() {
  50.     console.info('[lifeCycle] Child aboutToDisappear')
  51.   }
  52.   // 组件生命周期
  53.   aboutToAppear() {
  54.     console.info('[lifeCycle] Child aboutToAppear')
  55.   }
  56.   build() {
  57.     Text(this.title).fontSize(50).onClick(() => {
  58.       this.title = 'Hello ArkUI';
  59.     })
  60.   }
  61. }
复制代码
以上示例中,Index页面包含两个自界说组件,一个是被@Entry装饰的MyComponent,也是页面的入口组件,即页面的根节点;一个是Child,是MyComponent的子组件。只有@Entry装饰的节点才可以生效页面的生命周期方法,以是MyComponent中声明了当前Index页面的页面生命周期函数。MyComponent和其子组件Child也同时也声明了组件的生命周期函数。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4