ts-custom-component-lifecycle.md 8.0 KB
Newer Older
Z
zengyawen 已提交
1 2 3 4 5 6
# 自定义组件的生命周期

自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期,这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。

>**说明:**
>
H
HelloCrease 已提交
7 8
>- 本模块首批接口从API version 7开始支持,后续版本的新增接口,采用上角标单独标记接口的起始版本。
>- 允许在生命周期函数中使用Promise和异步回调函数,比如网络资源获取,定时器设置等。
Z
zengyawen 已提交
9 10 11 12 13 14 15 16


## aboutToAppear

aboutToAppear?(): void

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

S
sunbees 已提交
17
从API version 9开始,该接口支持在ArkTS卡片中使用。
Z
zengyawen 已提交
18 19 20 21 22 23 24

## aboutToDisappear

aboutToDisappear?(): void

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

S
sunbees 已提交
25
从API version 9开始,该接口支持在ArkTS卡片中使用。
Z
zengyawen 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

## onPageShow

onPageShow?(): void

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


## onPageHide

onPageHide?(): void

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


## onBackPress

H
hwx1119949 已提交
43
onBackPress?(): void | boolean
Z
zengyawen 已提交
44

H
HelloCrease 已提交
45
当用户点击返回按钮时触发,仅\@Entry装饰的自定义组件生效。
Z
zengyawen 已提交
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89


```ts
// xxx.ets
@Entry
@Component
struct IndexComponent {
  @State textColor: Color = Color.Black;

  onPageShow() {
    this.textColor = Color.Blue;
    console.info('IndexComponent onPageShow');
  }

  onPageHide() {
    this.textColor = Color.Transparent;
    console.info('IndexComponent onPageHide');
  }

  onBackPress() {
    this.textColor = Color.Red;
    console.info('IndexComponent onBackPress');
  }

  build() {
    Column() {
      Text('Hello World')
        .fontColor(this.textColor)
        .fontSize(30)
        .margin(30)
    }.width('100%')
  }
}
```

![zh-cn_image_0000001563060749](figures/zh-cn_image_0000001563060749.png)


## onLayout<sup>9+</sup>

onLayout?(children: Array&lt;LayoutChild&gt;, constraint: ConstraintSizeOptions): void

框架会在自定义组件布局时,将该自定义组件的子节点信息和自身的尺寸范围通过onLayout传递给该自定义组件。不允许在onLayout函数中改变状态变量。

Z
zhongjianfei 已提交
90 91
从API version 9开始,该接口支持在ArkTS卡片中使用。

Z
zengyawen 已提交
92 93 94 95 96 97 98 99 100 101 102 103 104 105
**参数:**

| 参数名        | 类型                                       | 说明               |
| ---------- | ---------------------------------------- | ---------------- |
| children   | Array&lt;[LayoutChild](#layoutchild9)&gt; | 子组件布局信息。         |
| constraint | [ConstraintSizeOptions](ts-types.md#constraintsizeoptions) | 父组件constraint信息。 |


## onMeasure<sup>9+</sup>

onMeasure?(children: Array&lt;LayoutChild&gt;, constraint: ConstraintSizeOptions): void

框架会在自定义组件确定尺寸时,将该自定义组件的子节点信息和自身的尺寸范围通过onMeasure传递给该自定义组件。不允许在onMeasure函数中改变状态变量。

Z
zhongjianfei 已提交
106 107
从API version 9开始,该接口支持在ArkTS卡片中使用。

Z
zengyawen 已提交
108 109 110 111 112 113 114
**参数:**

| 参数名        | 类型                                       | 说明               |
| ---------- | ---------------------------------------- | ---------------- |
| children   | Array&lt;[LayoutChild](#layoutchild9)&gt; | 子组件布局信息。         |
| constraint | [ConstraintSizeOptions](ts-types.md#constraintsizeoptions) | 父组件constraint信息。 |

G
guozejun 已提交
115
## aboutToReuse<sup>10+</sup>
G
guozejun 已提交
116

G
guozejun 已提交
117
aboutToReuse?(params: { [key: string]: unknown }): void
G
guozejun 已提交
118

G
guozejun 已提交
119
当一个可复用的自定义组件从复用缓存中重新加入到节点树时,触发aboutToReuse生命周期回调,并将组件的构造参数传递给aboutToReuse。
G
guozejun 已提交
120 121 122 123 124

从API version 10开始,该接口支持在ArkTS卡片中使用。

**参数:**

H
HelloCrease 已提交
125 126
| 参数名    | 类型                         | 说明         |
| ------ | -------------------------- | ---------- |
G
guozejun 已提交
127
| params | { [key: string]: unknown } | 自定义组件的构造参数 |
Z
zengyawen 已提交
128

G
guozejun 已提交
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

```ts
// xxx.ets
@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  @State switch: boolean = true

  build() {
    Column() {
      Button(this.message)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          this.switch = !this.switch
        })
      if (this.switch) {
        Child()
      }
    }
    .height("100%")
    .width('100%')
  }
}

G
guozejun 已提交
155
@Reusable
G
guozejun 已提交
156 157
@Component
struct Child {
G
guozejun 已提交
158
  aboutToReuse(params) {
G
guozejun 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171 172
    console.info("Recycle Child")
  }

  build() {
    Column() {
      Text("Child Component")
        .fontSize(20)
    }
    .borderWidth(2)
    .height(100)
  }
}
```

Z
zengyawen 已提交
173 174 175 176
## LayoutChild<sup>9+</sup>

子组件布局信息。

Z
zhongjianfei 已提交
177 178
从API version 9开始,该接口支持在ArkTS卡片中使用。

Z
zengyawen 已提交
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
| 参数         | 参数类型                                     | 描述                  |
| ---------- | ---------------------------------------- | ------------------- |
| name       | string                                   | 子组件名称。              |
| id         | string                                   | 子组件id。              |
| constraint | [ConstraintSizeOptions](ts-types.md#constraintsizeoptions) | 子组件约束尺寸。            |
| borderInfo | [LayoutBorderInfo](#layoutborderinfo9)   | 子组件border信息。        |
| position   | [Position](ts-types.md#position)         | 子组件位置坐标。            |
| measure    | (childConstraint:)&nbsp;=&gt;&nbsp;void  | 调用此方法对子组件的尺寸范围进行限制。 |
| layout     | (LayoutInfo:&nbsp;[LayoutInfo](#layoutinfo9))&nbsp;=&gt;&nbsp;void | 调用此方法对子组件的位置信息进行限制。 |


## LayoutBorderInfo<sup>9+</sup>

子组件border信息。

Z
zhongjianfei 已提交
194 195
从API version 9开始,该接口支持在ArkTS卡片中使用。

Z
zengyawen 已提交
196 197 198 199 200 201 202 203 204 205 206
| 参数          | 参数类型                                 | 描述                      |
| ----------- | ------------------------------------ | ----------------------- |
| borderWidth | [EdgeWidths](ts-types.md#edgewidths) | 边框宽度类型,用于描述组件边框不同方向的宽度。 |
| margin      | [Margin](ts-types.md#margin)         | 外边距类型,用于描述组件不同方向的外边距。   |
| padding     | [Padding](ts-types.md#padding)       | 内边距类型,用于描述组件不同方向的内边距。   |


## LayoutInfo<sup>9+</sup>

子组件layout信息。

Z
zhongjianfei 已提交
207 208
从API version 9开始,该接口支持在ArkTS卡片中使用。

Z
zengyawen 已提交
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
| 参数         | 参数类型                                     | 描述       |
| ---------- | ---------------------------------------- | -------- |
| position   | [Position](ts-types.md#position)         | 子组件位置坐标。 |
| constraint | [ConstraintSizeOptions](ts-types.md#constraintsizeoptions) | 子组件约束尺寸。 |


```ts
// xxx.ets
@Entry
@Component
struct Index {
  build() {
    Column() {
      CustomLayout() {
        ForEach([1, 2, 3], (index) => {
          Text('Sub' + index)
            .fontSize(30)
            .borderWidth(2)
        })
      }
    }
  }
}


@Component
struct CustomLayout {
  @BuilderParam builder: () => {};

  onLayout(children: Array<LayoutChild>, constraint: ConstraintSizeOptions) {
    let pos = 0;
    children.forEach((child) => {
      child.layout({ position: { x: pos, y: pos }, constraint: constraint })
      pos += 100;
    })
  }

  onMeasure(children: Array<LayoutChild>, constraint: ConstraintSizeOptions) {
    let size = 100;
    children.forEach((child) => {
      child.measure({ minHeight: size, minWidth: size, maxWidth: size, maxHeight: size })
      size += 50;
    })
  }

  build() {
    this.builder()
  }
}
```

![zh-cn_image_0000001511900496](figures/zh-cn_image_0000001511900496.png)