@Prop
装饰的变量可以和父组件建立单向的同步关系。@Prop
装饰的变量是可变的,但是变化不会同步回其父组件。
概述
@Prop
装饰的变量和父组件建立单向的同步关系:
@Prop
变量允许在本地修改,但修改后的变化不会同步回父组件。- 当父组件中的数据源更改时,与之相关的
@Prop
装饰的变量都会自动更新。如果子组件已经在本地修改了@Prop
装饰的相关变量值,而在父组件中对应的@State
装饰的变量被修改后,子组件本地修改的@Prop
装饰的相关变量值将被覆盖。
限制条件
@Prop
装饰器不能在@Entry
装饰的自定义组件中使用。
装饰器使用规则说明
@Prop变量装饰器 | 说明 |
---|---|
装饰器参数 | 无 |
同步类型 | 单向同步:对父组件状态变量值的修改,将同步给子组件@Prop装饰的变量,子组件@Prop变量的修改不会同步到父组件的状态变量上 |
允许装饰的变量类型 | string、number、boolean、enum类型。不支持any,不允许使用undefined和null。必须指定类型。在父组件中,传递给@Prop装饰的值不能为undefined或者null, |
被装饰变量的初始值 | 允许本地初始化。 |
变量的传递/访问规则说明
传递/访问 | 说明 |
---|---|
从父组件初始化 | 如果本地有初始化,则是可选的。没有的话,则必选,支持父组件中的常规变量、@State、@Link、@Prop、@Provide、@Consume、@ObjectLink、@StorageLink、@StorageProp、@LocalStorageLink和@LocalStorageProp去初始化子组件中的@Prop变量。 |
用于初始化子组件 | @Prop支持去初始化子组件中的常规变量、@State、@Link、@Prop、@Provide。 |
是否支持组件外访问 | @Prop装饰的变量是私有的,只能在组件内访问。 |
初始化规则图示
观察变化和行为表现
观察变化
@Prop
装饰的数据可以观察到以下变化。
当装饰的类型是允许的类型,即string
、number
、boolean
、enum
类型都可以观察到的赋值变化;
// 简单类型
@Prop count: number;
// 赋值的变化可以被观察到
this.count = 1;
对于@State
和@Prop
的同步场景:
- 使用父组件中
@State
变量的值初始化子组件中的@Prop
变量。当@State
变量变化时,该变量值也会同步更新至@Prop
变量。 @Prop
装饰的变量的修改不会影响其数据源@State装饰变量的值。- 除了
@State
,数据源也可以用@Link
或@Prop
装饰,对@Prop
的同步机制是相同的。 - 数据源和
@Prop
变量的类型需要相同。
框架行为
要理解@Prop
变量值初始化和更新机制,有必要了解父组件和拥有@Prop
变量的子组件初始渲染和更新流程。
1.初始渲染:
- 执行父组件的
build()
函数将创建子组件的新实例,将数据源传递给子组件; - 初始化子组件
@Prop
装饰的变量。
2.更新:
- 子组件
@Prop
更新时,更新仅停留在当前子组件,不会同步回父组件; - 当父组件的数据源更新时,子组件的
@Prop
装饰的变量将被来自父组件的数据源重置,所有@Prop
装饰的本地的修改将被父组件的更新覆盖。
使用场景
1.父组件@State
到子组件@Prop
简单数据类型同步;
2.父组件@State
数组项到子组件@Prop
简单数据类型同步
3.从父组件中的@State
类对象属性到@Prop
简单类型的同步
4.@Prop
本地初始化不和父组件同步
- 为了支持
@Component
装饰的组件复用场景,@Prop
支持本地初始化,这样可以让@Prop
是否与 - 父组件建立同步关系变得可选。当且仅当
@Prop
有本地初始化时,从父组件向子组件传递@Prop
的数据源才是可选的。
注意:由于我用的DevEco版本是 DevEco Studio 3.1.1 Release
、API9
,非最新版,所以在@Prop
本地初始化的时候会报错提示,但是不影响程序运行。