【HM】简单说明白:@State、@Prop、@Link、@Provide、@Consume、@Watch 原创

与辉鸿蒙
发布于 2024-11-9 22:37
浏览
0收藏

简单说明白:装饰器@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的值发生了变化';

}

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
收藏
回复
举报
回复
    相关推荐