# 自定义组件初始化
本节介绍自定义组件状态变量的初始化规则。
组件的成员变量可以通过两种方式初始化:
- 本地初始化,例如:
```
@State counter: Counterr = new Counter()
```
- 在构造组件时通过构造参数初始化,例如:
```
MyComponent(counter: $myCounter)
```
具体允许哪种方式取决于状态变量的装饰器:
装饰器类型
|
本地初始化
|
通过构造函数参数初始化
|
@State
|
必须
|
可选
|
@Prop
|
禁止
|
必须
|
@Link
|
禁止
|
必须
|
@StorageLink
|
必须
|
禁止
|
@StorageProp
|
必须
|
禁止
|
@Provide
|
必须
|
可选
|
@Consume
|
禁止
|
禁止
|
@ObjectLink
|
禁止
|
必须
|
常规成员变量
|
推荐
|
可选
|
从上表中:
- **@State**变量需要本地初始化,初始化的值可以被构造参数覆盖;
- **@Prop**和**@Link**变量必须且仅通过构造函数参数进行初始化。
通过构造函数方法初始化成员变量,需要遵循如下规则:
从父组件中的变量(下)到子组件中的变量(右)
|
@state
|
@Link
|
@Prop
|
常规变量
|
@State
|
允许
|
允许
|
允许
|
允许
|
@Link
|
不允许
|
允许
|
不推荐
|
允许
|
@Prop
|
不允许
|
不允许
|
允许
|
允许
|
@StorageLink
|
不允许
|
允许
|
不允许
|
允许
|
@StorageProp
|
不允许
|
不允许
|
不允许
|
允许
|
常规变量
|
允许
|
不允许
|
不允许
|
允许
|
从上表中:
- 父组件的常规变量可以用于初始化子组件的**@State**变量,但不能用于初始化**@Link**或**@Prop**变量;
- 父组件的**@State**变量可以初始化子组件的**@Prop**、**@Link(通过$)**或常规变量,但不能初始化子组件的**@State**变量;
- 父组件的**@Link**变量可以初始化子组件的@Link或常规变量。但是初始化子组件的**@State**成员是语法错误,此外不建议初始化**@prop;**
- 父组件的**@Prop**变量可以初始化子组件的常规变量或**@Prop**变量,但不能初始化子组件的**@State**或**@Link**变量。
- @StorageLink和@StorageProp不允许由父组件中传递到子组件。
- 除了上述规则外,还需要遵循TS的强类型规则。
## 示例
```
@Entry
@Component
struct Parent {
@State parentState: ClassA = new ClassA()
build() {
Row() {
CompA({aState: new ClassA, aLink: $parentState}) // valid
CompA({aLink: $parentState}) // valid
CompA() // invalid, @Link aLink remains uninitialized
CompA({aLink: new ClassA}) // invalid, @Link aLink must be a reference ($) to either @State or @Link variable
}
}
}
@Component
struct CompA {
@State aState: boolean = false // must initialize locally
@Link aLink: ClassA // must not initialize locally
build() {
Row() {
CompB({bLink: $aLink, // valid init a @Link with reference of another @Link,
bProp: this.aState}) // valid init a @Prop with value of a @State
CompB({aLink: $aState, // invalid: type missmatch expected ref to ClassA, provided reference to boolean
bProp: false}) // valid init a @Prop by constants value
}
}
}
@Component
struct CompB {
@Link bLink: ClassA = new ClassA() // invalid, must not initialize locally
@Prop bProp: boolean = false // invalid must not initialize locally
build() {
...
}
}
```