ts-component-based-component.md 2.3 KB
Newer Older
Z
zengyawen 已提交
1
# @Component<a name="ZH-CN_TOPIC_0000001157388849"></a>
Z
zengyawen 已提交
2

Z
zengyawen 已提交
3
**@Component**装饰的**struct**表示该结构体具有组件化能力,能够成为一个独立的组件,这种类型的组件也称为自定义组件,在**build**方法里描述UI结构。自定义组件具有以下特点:
Z
zengyawen 已提交
4

Z
zengyawen 已提交
5 6 7 8
-   **可组合:**允许开发人员组合使用内置组件、其他组件、公共属性和方法;
-   **可重用:**自定义组件可以被其他组件重用,并作为不同的实例在不同的父组件或容器中使用;
-   **生命周期:**生命周期的回调方法可以在组件中配置,用于业务逻辑处理;
-   **数据驱动更新:**由状态变量的数据驱动,实现UI自动更新。
Z
zengyawen 已提交
9

Z
zengyawen 已提交
10
对组件化的深入描述,请参考[深入理解组件化](ts-a-deep-dive-into-component.md)
Z
zengyawen 已提交
11

Z
zengyawen 已提交
12 13 14
>![](../../public_sys-resources/icon-note.gif) **说明:** 
>-   自定义组件必须定义build方法。
>-   自定义组件禁止自定义构造函数。
Z
zengyawen 已提交
15

Z
zengyawen 已提交
16
## 示例<a name="section84921442616"></a>
Z
zengyawen 已提交
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

如下代码定义了**MyComponent**组件**:**

```
@Component
struct MyComponent {
    build() {
        Column() {
            Text('my component')
                .fontColor(Color.Red)
        }.alignItems(HorizontalAlign.Center) // center align Text inside Column
    }
}
```

**MyComponent****build**方法会在初始渲染时执行,此外,当组件中的状态发生变化时,**build**方法将再次执行。

以下代码使用了**MyComponent**组件:

```
@Component
struct ParentComponent {
    build() {
        Column() {
            MyComponent()
            Text('we use component')
                .fontSize(20)
        }
    }
}
```

Z
zengyawen 已提交
49
可以多次使用**MyComponent**,并在不同的组件中进行重用:
Z
zengyawen 已提交
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

```
@Component
struct ParentComponent {
    build() {
        Row() {
            Column() {
                MyComponent()
                Text('first column')
                    .fontSize(20)
            }
            Column() {
                MyComponent()
                Text('second column')
                    .fontSize(20)
            }
        }
    }

    private aboutToAppear() {
        console.log('ParentComponent: Just created, about to become rendered first time.')
    }

    private aboutToDisappear() {
        console.log('ParentComponent: About to be removed from the UI.')
    }
}
```
Z
zengyawen 已提交
78