美文网首页ArkTS/ArkUI实战
十二、鸿蒙ArkTS/ArkUI实战-装饰器@Provide和@

十二、鸿蒙ArkTS/ArkUI实战-装饰器@Provide和@

作者: ISwiftUI | 来源:发表于2023-11-21 09:49 被阅读0次
    • 1、@Provide作为数据的提供方,可以更新其子孙节点的数据,并触发页面渲染。@Consume在感知到

    • 2、@Provide数据的更新后,会触发当前自定义组件的重新渲染。

    • 3、@Provide

      • 装饰器参数是一个string类型的常量,用于给装饰的变量起别名。如果规定别名,则提供对应别名的数据更新。如果没有,则使用变量名作为别名。推荐使用@Provide('alias')这种形式。
      • 同步机制:@Provide的变量类似@State,可以修改对应变量进行页面重新渲染。也可以修改@Consume装饰的变量,反向修改@State变量。
      • 必须设置初始值。
      • 触发页面渲染的修改:基础类型(boolean,string,number)变量的改变;@Observed class类型变量及其属性的修改;添加,删除,更新数组中的元素。
    • @Consume

      • 不可设置默认初始值。

    示例:

    import router from '@ohos.router';
    
    @Entry
    @Component
    struct Third {
      //因为是数组所以需要用到@ObjectLink和@Observed
      @State arrA: ClassA[] = [new ClassA(2), new ClassA(0)]
      //此修饰符与@Consume组合可以让其与孙子节点数据双向绑定
      @Provide("reviewVote") reviewVotes: number = 0;
    
      build() {
        Row() {
          Column() {
            ForEach(this.arrA, (item) => {
              TextChild({ a: item })
            }, (item) => item.id.toString())
            ForEach(this.arrA, (item) => {
              Child({ a: item })
            }, (item) => item.id.toString())
            Button() {
              Text('Back')
                .fontSize(45)
                .fontColor($r('app.color.start_window_background'))
            }
            .type(ButtonType.Capsule)
            .width('60%')
            .height('10%')
            .backgroundColor($r('app.color.button_next_background'))
            .onClick(() => {
              router.back()
            })
    
            Button() {
              Text('Add')
                .fontSize(45)
                .fontColor($r('app.color.start_window_background'))
            }
            .type(ButtonType.Capsule)
            .width('60%')
            .height('5%')
            .backgroundColor($r('app.color.button_next_background'))
            .margin({ top: 20 })
            .onClick(() => {
              this.arrA[0].c++
            })
            Button() {
              Text('AddChildChild'+this.reviewVotes)
                .fontSize(25)
                .fontColor($r('app.color.start_window_background'))
            }
            .type(ButtonType.Capsule)
            .width('60%')
            .height('10%')
            .backgroundColor($r('app.color.button_next_background'))
            .margin({ top: 20 })
            .onClick(() => {
              this.reviewVotes++
            })
          }
          .width('100%')
        }
        .height('100%')
      }
    }
    
    @Component
    struct TextChild {
      @ObjectLink a: ClassA
    
      build() {
        Column() {
          Text(this.a.c + "TextChild")
            .align(Alignment.Center)
            .fontSize(40)
            .fontWeight(FontWeight.Bold)
          TextChildChild()
        }
      }
    }
    
    @Component
    struct TextChildChild {
      //此修饰符与爷爷组件的@Provide组合可以与爷爷组件双向绑定
      @Consume("reviewVote") reviewVotes: number
    
      build() {
        Column() {
          Button() {
            Text('RemoveChildChild'+this.reviewVotes)
              .fontSize(20)
              .fontColor($r('app.color.start_window_background'))
          }
          .type(ButtonType.Capsule)
          .width('60%')
          .height('5%')
          .backgroundColor($r('app.color.button_next_background'))
          .margin({ top: 20 })
          .onClick(() => {
            this.reviewVotes--
          })
          Text(this.reviewVotes + "TextChildChild")
            .align(Alignment.Center)
            .fontSize(40)
            .fontWeight(FontWeight.Bold)
        }
      }
    }
    
    @Component
    struct Child {
      @ObjectLink a: ClassA
    
      build() {
        Column() {
          Text(this.a.c + "Child")
            .align(Alignment.Center)
            .fontSize(40)
            .fontWeight(FontWeight.Bold)
          Button('count - costOfOneAttempt')
            .margin(15)
            .onClick(() => {
              this.a.c--
            })
        }
      }
    }
    
    var nextID: number = 0
    
    @Observed
    class ClassA {
      public name: string
      public c: number
      public id: number
    
      constructor(c: number, name: string = 'OK') {
        this.name = name
        this.c = c
        this.id = nextID++
      }
    }
    

    相关文章

      网友评论

        本文标题:十二、鸿蒙ArkTS/ArkUI实战-装饰器@Provide和@

        本文链接:https://www.haomeiwen.com/subject/zyjmwdtx.html