【HM】简单说明白:@State、@Prop、@Link、@Provide、@Consume、@Watch 原创
简单说明白:装饰器@State、@Prop、@Link、@Provide、@Consume修饰变量,@Watch监听变量状态发生变化
首先要明白什么是“状态变量”?即被状态装饰器(@State、@Prop、@Link、@Provide、@Consume)修饰的变量,比如 @State str : string=‘’; str就是状态变量。状态变量值的改变会引起UI界面重新渲染。
@State
@State装饰的变量,是私有的,只能被组件内部访问,在声明时必须指定其类型和本地初始化。
以下示例为@State装饰的简单类型,count被@State装饰成为状态变量,count的改变引起Button组件的刷新:
@Component
struct MyComponent {
@State count: number = 0;
build() {
Button(`click times: ${this.count}`)
.onClick(() => {
this.count += 1;
})
}
}
@Prop
父组件与子组件单向同步,@Prop装饰的变量变化后不会同步影响其父组件。
@Prop装饰器不能在@Entry装饰的自定义组件中使用。
当数据源更改时,@Prop装饰的变量都会更新,并且会覆盖本地所有更改。因此,数值的同步是父组件到子组件(所属组件),子组件数值的变化不会同步到父组件。
@Link
父、子组件双向同步,子组件中被@Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。
@Provide和@Consume
应用于与后代组件的双向数据同步,适用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间的状态传递,@Provide和@Consume实现跨层级传递,不受限父、子之间,还可以父、孙之间传递(跨过子组件)。
可以通过相同的变量名或者相同的变量别名绑定,变量类型必须相同。比如,@Provide num : number=0; @Consume num : number; 或 @Provide(‘num’) num1 : number=1; @Consume(‘num’) num2 : number;
@Watch
应用于对状态变量的监听。如果需要关注某个状态变量的值是否改变,可以使用@Watch为状态变量设置回调函数。当状态变量变化时,所设置的回调函数将被调用。
注意:不要在回调函数里修改@Watch装饰的状态变量,否则陷入死循环。
@Watch(‘changeHandler’) @State/Prop/Link/Provide num : number=0;
@State str : string =‘’;
changeHandler(){
str ='num的值发生了变化';
}