OpenHarmony ETS 类状态 @Watch图文示例秒懂用法 原创 精华

陈浩南xxx
发布于 2022-4-13 15:51
浏览
1收藏

往前系列文章:

简单的变量传值:OpenHarmony ETS 状态变量(@State,@Prop,@Link) 图文秒懂用法-OpenHarmony技术社区-51CTO.COM

跨组件传值:OpenHarmony ETS 类状态 @Consume和@Provide 图文示例秒懂用法-OpenHarmony技术社区-51CTO.COM

类嵌套类:OpenHarmony ETS 类状态@Observed和@ObjectLink图文示例秒懂用法-OpenHarmony技术社区-51CTO.COM

若数据改变我们要做额外的处理时,可以用到@Watch标记

@Watch

  • 应用可以注册回调方法。当一个被@State, @Prop, @Link, @ObjectLink, @Provide, @Consume, @StorageProp, 以及 @StorageLink中任意一个装饰器修饰的变量改变时,均可触发此回调。@Watch中的变量一定要使用(“”)进行包装。
    *测试@StorageLink时发现,@Watch不起作用。

1,@State

OpenHarmony ETS  类状态 @Watch图文示例秒懂用法-鸿蒙开发者社区

@Component
struct ChildWatchState {
  @State @Watch("onBasketUpdated") shopBasket: Array<number> = [7, 12, 47, 3];
  @State totalPurchase: number = 0;

  updateTotal(): number {
    let sum = 0;
    this.shopBasket.forEach((i) => {
      sum += i;
    });
    this.totalPurchase = (sum < 100) ? sum : 0.9 * sum;
    return this.totalPurchase;
  }

  onBasketUpdated(): void {
    this.updateTotal();
  }

  build() {
    Column() {
      Text('@State @Watch').fontSize(24)
      Button(`add 2 Array`).fontSize(24)
        .onClick(() => {
          this.shopBasket.push(Math.round(100 * Math.random()))
        })

      Text(`数组和:${this.totalPurchase}`).fontSize(30)
    }
  }
}

2,@Prop

OpenHarmony ETS  类状态 @Watch图文示例秒懂用法-鸿蒙开发者社区

@Component
struct ChildWatchProp {
  @Prop @Watch("onPropWatch") count: number ;
  @State onPropWatchCount: number = 0;

  onPropWatch(): void {
    console.log("onPropWatch:" + this.onPropWatchCount)
    this.onPropWatchCount += 1
  }

  build() {
    Column() {
      Text('@Prop @Watch').fontSize(24)

      Button(`点击count+1`).fontSize(24)
        .onClick(() => {
          this.count += 1
        })
      Text(`onPropWatch触发:${this.onPropWatchCount}`).fontSize(30)
    }.width('100%')
    .margin({ top: 10 })
  }
}

3,@Link

OpenHarmony ETS  类状态 @Watch图文示例秒懂用法-鸿蒙开发者社区OpenHarmony ETS  类状态 @Watch图文示例秒懂用法-鸿蒙开发者社区

@Component
struct ChildWatchLink{
  @Link @Watch("onLinkWatch") count: number ;
  @State onLinkWatchCount: number = 0;

  onLinkWatch(): void {
    console.log("onLinkWatch:" + this.onLinkWatchCount)
    this.onLinkWatchCount += 1
  }

  build() {
    Column() {
      Text('@Link @Watch').fontSize(24)

      Button(`点击count+1`).fontSize(24)
        .onClick(() => {
          this.count += 1
        })
      Text(`onLinkWatch触发:${this.onLinkWatchCount}`).fontSize(30)
    }.width('100%')
    .margin({ top: 10 })
  }
}

4,@Consume

OpenHarmony ETS  类状态 @Watch图文示例秒懂用法-鸿蒙开发者社区

@Component
struct ChildWatchConsume {
  @Consume('name1') @Watch("onConsumeWatch") name: string ;
  @State onConsumeWatchCount: number = 0;

  onConsumeWatch(): void {
    console.log("onConsumeWatch:" + this.onConsumeWatchCount)
    this.onConsumeWatchCount += 1
  }

  build() {
    Column() {
      Text('@Consume @Watch').fontSize(24)

      Text(`${this.name}`).fontSize(24)

      Button(`点击count+1`).fontSize(24)
        .onClick(() => {
          this.name = this.name + "s"
        })
      Text(`onConsumeWatch触发:${this.onConsumeWatchCount}`).fontSize(30)
    }.width('100%')
    .margin({ top: 10 })
  }
}

entry 代码

@Entry
@Component
struct CompA {
  @State testCount: number = 0;
  @Provide('name1') name: string = "纳米";

  build() {
    Column() {
      Text(' 被@State, @Prop, @Link, @ObjectLink, @Provide, @Consume, @StorageProp, ' +
      '以及 @StorageLink中任意一个装饰器修饰的变量改变时,均可触发此回调').fontSize(24).fontColor('#FF0000')

      ChildWatchState()

      ChildWatchProp({ count: 1 })

      ChildWatchLink({ count: $testCount });

      ChildWatchConsume();

    }
  }
}

5,总结

  • @State @Watch(“onBasketUpdated”) shopBasket: Array<number> = [7, 12, 47, 3];
  • @Prop @Watch(“onPropWatch”) count: number ;

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
已于2022-4-22 09:40:08修改
4
收藏 1
回复
举报
3条回复
按时间正序
/
按时间倒序
伴随时光漂泊
伴随时光漂泊

请问一下,ets的watch监听到的值是变化之前的还是变化之后的

回复
2022-4-28 10:16:58
陈浩南xxx
陈浩南xxx 回复了 伴随时光漂泊
请问一下,ets的watch监听到的值是变化之前的还是变化之后的

之后的值

回复
2022-4-29 11:29:34
陈浩南xxx
陈浩南xxx

发现 测试@StorageLink时发现,@Watch不起作用

1
回复
2022-6-8 16:34:44
回复
    相关推荐