首页 > 其他分享 >HarmonyOS4.0系列——05、状态管理之@Prop、@Link、@Provide、@Consume,以及@Watch装饰器

HarmonyOS4.0系列——05、状态管理之@Prop、@Link、@Provide、@Consume,以及@Watch装饰器

时间:2024-01-20 22:07:31浏览次数:25  
标签:Index Consume 05 Provide Text 绑定 组件 message

状态管理

看下面这张图

HarmonyOS4.0系列——05、状态管理之@Prop、@Link、@Provide、@Consume,以及@Watch装饰器_Text

Components部分的装饰器为组件级别的状态管理,Application部分为应用的状态管理。开发者可以通过@StorageLink/@LocalStorageLink 实现应用和组件状态的双向同步,通过@StorageProp/@LocalStorageProp 实现应用和组件状态的单向同步。

@Prop

static Prop(propName: string): any

与 AppStorage 中对应的 propName 建立单向属性绑定。如果给定的 propName 在 AppStorage 中存在,则返回与 AppStorage 中 propName 对应属性的单向绑定数据。如果 AppStorage 中不存在 propName,则返回 undefined。单向绑定数据的修改不会被同步回 AppStorage 中。 prop 是单向绑定,但父级不会跟子集进行相应

@Prop 是单向传递。

@Entry
@Component
struct Index {
  // State必须要进行初始化
  @State message: string ='Southern Wind'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .textStyle()
        Button('点击')
          .backgroundColor(Color.Black)

          .onClick(()=>{
            this.message= this.message  === 'Southern Wind'? '你好' : 'Southern Wind';
          })
        StateProp({content:this.message})
      }
      .width('100%')
    }
  }
}


// 子组件
@Component
struct StateProp{
  @Prop content:string
  build(){
    Column(){
      Text('prop:'+this.content)
        .textStyle()
        .fontColor(Color.Green)
      Button('修改数据')
        .btnStyle(()=>{
          this.content = 'HarmonyOS4.0'
        })
    }
  }
}
// 文本公共样式
@Extend(Text) function textStyle() {
  .fontSize(30)
  .fontWeight(FontWeight.Bold)
}
// 按钮公共样式
@Extend(Button) function btnStyle(click:Function) {
  .backgroundColor(Color.Green)
  .fontSize(25)
  .margin(10)
  .onClick(()=>{
    click()
  })
 }

效果:

HarmonyOS4.0系列——05、状态管理之@Prop、@Link、@Provide、@Consume,以及@Watch装饰器_数据_02

关于多个页面使用相同组件重名报错问题: 可以自己定义一个规范: 我这里用结构体名称加下划线的形式命名函数,如果文件名为 Index,那么我的按钮组件可以用Index_btnStyle

@Link

static Link(propName: string): any

与 AppStorage 中对应的 propName 建立双向数据绑定。如果给定的 propName 在 AppStorage 中存在,返回与 AppStorage 中 propName 对应属性的双向绑定数据。

双向绑定数据的修改会同步回 AppStorage 中,AppStorage 会将变化同步到所有绑定该 propName 的数据和自定义组件中。

如果 AppStorage 中不存在 propName,则返回 undefined。

以上是官方的说明,其实说白了Prop就是单项数据绑定,Link是双向数据绑定。

@Link 和@Prop 的区别

继续往下看个例子就明白了:

@Entry
@Component
struct Index {
  // State必须要进行初始化
  @State message: string = 'Southern Wind'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .textStyle()
        Button('点击')
          .backgroundColor(Color.Black)

          .onClick(() => {
            this.message = this.message === 'Southern Wind' ? '你好' : 'Southern Wind';
          })
        StateProp({ content: this.message })
        // Index_link({content_link:this.message})
        // 如果是Link,则使用$+变量名进行传递
        Index_link({content_link: $message})
      }
      .width('100%')
    }
  }
}


// 子组件
@Component
struct StateProp {
  @Prop content: string
  build() {
    Column() {
      Text('prop:' + this.content)
        .textStyle()
        .fontColor(Color.Green)
      Button('修改Prop数据')
        .btnStyle(() => {
          this.content = '我是Prop数据'
        })
    }
  }
}

@Component
struct Index_link {
  @Link content_link: string
  build() {
    Column() {
      Text('link:' + this.content_link)
        .textStyle()
        .fontColor(Color.Red)
      Button('修改Link数据').btnStyle(()=>{
        this.content_link = '我是Link数据'
      })
        .backgroundColor(Color.Red)
    }
  }
}


// 文本公共样式
@Extend(Text) function textStyle() {
  .fontSize(30)
  .fontWeight(FontWeight.Bold)
}
// 按钮公共样式
@Extend(Button) function btnStyle(click: Function) {
  .backgroundColor(Color.Green)
  .fontSize(25)
  .margin(10)
  .onClick(() => {
    click()
  })
  // .click()
}

效果:

HarmonyOS4.0系列——05、状态管理之@Prop、@Link、@Provide、@Consume,以及@Watch装饰器_ide_03

父孙组件传递 @Provide@Consume 与后代组件双向同步

父孙组件可以使用@Link来进行双向绑定,但是和子组件来说的话没法进行区分,所以需要使用@Provide@Consume来进行区分。 例:

@Entry
@Component

struct  Index{
  @Provide message:string = '我是父组件'
  build(){
    Row(){
      Column({space:20}){
        Text(this.message).IndexTextStyle()
          .onClick(()=>{
            this.message = 'Southern Wind'
          })
        Divider()
        Index_son()


      }.width('100%')
    }.height('100%')
  }
}


@Component
struct Index_son{
  build(){
    Column({space:30}){
      Text('子组件').IndexTextStyle()
      Divider()
      Index_sun()
    }
  }
}

@Component
struct Index_sun{
  @Consume message:string
  build(){
    Column(){
      Text('孙组件' + this.message).IndexTextStyle()
        .onClick(()=>{
          this.message = 'HarmonyOS 4.0'
        })

    }
  }
}

@Extend(Text) function IndexTextStyle() {
  .fontSize(30)
}

HarmonyOS4.0系列——05、状态管理之@Prop、@Link、@Provide、@Consume,以及@Watch装饰器_Text_04

其中@Provide装饰的变量是在祖先节点中,可以理解为被“提供”给后代的状态变量。@Consume装饰的变量是在后代组件中,去“消费(绑定)”祖先节点提供的变量。

** @Provide/@Consume装饰的状态变量有以下特性:**

  • @Provide装饰的状态变量自动对其所有后代组件可用,即该变量被“provide”给他的后代组件。由此可见,@Provide的方便之处在于,开发者不需要多次在组件之间传递变量。
  • 后代通过使用@Consume去获取@Provide提供的变量,建立在@Provide@Consume之间的双向数据同步,与@State/@Link不同的是,前者可以在多层级的父子组件之间传递。
  • @Provide@Consume可以通过相同的变量名或者相同的变量别名绑定,变量类型必须相同。
// 通过相同的变量名绑定
@Provide a: number = 0;
@Consume a: number;

// 通过相同的变量别名绑定
@Provide('a') b: number = 0;
@Consume('a') c: number;

如果@Provide@Consume绑定的变量名不相同,则可以通过变量别名来区分。

// 通过相同的变量别名绑定
@Provide('a') b: number = 0;
@Consume('d') c: number

@Watch:状态变量更改通知

@Watch应用于对状态变量的监听。如果开发者需要关注某个状态变量的值是否改变,可以使用@Watch为状态变量设置回调函数。

@Watch用于监听状态变量的变化,当状态变量变化时,@Watch的回调方法将被调用。@Watch在ArkUI框架内部判断数值有无更新使用的是严格相等(===),遵循严格相等规范。当在严格相等为false的情况下,就会触发@Watch的回调。

@Entry
@Component
struct Index {
  @State @Watch('change') count:number = 0
  @State num:number = 2
  @State total:number = 0
  change(){
    this.total = Math.pow(this.count,this.num)
  }
  build() {
    Row(){
      Column({space:20}) {
        Text(`公式:${this.count}^${this.num}=${this.total}`).fontSize(30).fontColor(Color.Blue)
        Divider()
        Text('数字:'+this.count)
          .fontSize(30)
          .onClick(()=>{
            this.count ++
          })
        Divider()
        Text('次方:' + this.num).fontSize(25)
          .onClick(()=>{
            this.num ++
          })
        Divider()
        Text('结果:'+this.total).fontSize(40)
      }.width('100%')
    }.height('100%')
  }
}

HarmonyOS4.0系列——05、状态管理之@Prop、@Link、@Provide、@Consume,以及@Watch装饰器_Text_05

当点击次方为文本时无法进行监听,这是因为num只是定义了双向绑定,没有设置状态监听

这时需要将num 添加监听器

@State @Watch('change') num:number = 0

效果:

当点击次方为文本时无法进行监听,这是因为num只是定义了双向绑定,没有设置状态监听

这时需要将num 添加监听器

@State @Watch('change') num:number = 0

效果:

HarmonyOS4.0系列——05、状态管理之@Prop、@Link、@Provide、@Consume,以及@Watch装饰器_数据_06

标签:Index,Consume,05,Provide,Text,绑定,组件,message
From: https://blog.51cto.com/u_15947040/9346275

相关文章

  • UVA10539
    根据题意,可以很容易地发现,题目所要求的数都可以用形如$p^x$的式子表示(其中$p$为质数,\(x\ge2\)),即分解成只含同一个质因子的式子。这提示我们使用构造的思想。因为\(n\)最大为$10^{12}$,所以最大的\(\sqrtn\)也不会超过\(10^6\)。考虑使用线性筛求出\(10^6\)......
  • STM32CubeMX教程19 I2C - MPU6050驱动
    1、准备材料正点原子stm32f407探索者开发板V2.4STM32CubeMX软件(Version6.10.0)野火DAP仿真器keilµVision5IDE(MDK-Arm)ST-LINK/V2驱动XCOMV2.6串口助手逻辑分析仪nanoDLA2、实验目标使用STM32CubeMX软件配置STM32F407开发板的I2C1与MPU6050芯片通信,读取MPU6050的三轴加......
  • 吴师兄学算法day08 贪心 605. 种花问题
    题目:605.种花问题易错点:没想出来,借鉴了灵山的代码的思路,强行种花。我喜欢这个思路。感觉有点像设置哨兵那样的。 我的代码:classSolution:defcanPlaceFlowers(self,flowerbed:List[int],n:int)->bool:#修改数组,每次都种花,#凑够3个0......
  • 实战技巧CVE-2015-0005
    启用SMB签名和通信会话签名后,应用服务器和客户端之间的所有流量都有签名验证保护,中间人gongji者因为无法伪造签名而不能与目标主机进行正常的通信。签名密钥SessionKey基于客户端账号的口令NTLM值生成,应用服务器在认证阶段从认证服务器获取;客户端采用和认证服务器相同的算法,基于自......
  • Kafka 社区KIP-405中文译文(分层存储)
    原文链接:https://cwiki.apache.org/confluence/display/KAFKA/KIP-405%3A+Kafka+Tiered+Storage译者:KafkaKIP-405是一篇非常优秀的多层存储的设计稿,不过此设计稿涉及内容很多,文章量大、严谨、知识点诸多。我们国内还没有对其有相对完整的译文,面对如此上乘的文章,译者想降低其......
  • P6105 [Ynoi2010] y-fast trie
    更好的阅读体验P6105[Ynoi2010]y-fasttrie首先把所有数对\(C\)取模,分类讨论:\(x+y\geqC\)因为只会取模一次,这时显然取最大值和次大值。\(x+y<C\)一开始的想法是对于每一个数\(a\)找到另一个数满足\(a+b<C\)的最大的\(b\),这样是一棵外向树(环长一定\(=2\)),修改......
  • [ARC058E] 和風いろはちゃん
    题意若\(a=\{a_1,a_2,\cdotsa_n\}\)存在\(1\lex<y<z<w\len+1\)满足\(\sum\limits_{i=x}^{y-1}a_i=X,\sum\limits_{i=y}^{z-1}a_i=Y,\sum\limits_{i=z}^{w-1}a_i=Z\)时,则称数列\(a\)是好的。求在所有......
  • 05.接口请求体 - JSON
    目录 接口请求体JSON格式请求体介绍如何构造JSON格式请求体接口请求体简介 进行HTTP请求时,发送给服务器的数据。数据格式类型可以是JSON、XML、文本、图像等格式。请求体的格式和内容取决于服务器端API的设计和开发人员的要求。飞书接口文档常用接......
  • [oeasy]python005_退出游乐场_重启游乐场_系统态shell_应用态_quit
    退出终端_重启游乐场_shell_quit......
  • [oeasy]python005_退出游乐场_重启游乐场_系统态shell_应用态_quit
    退出终端_重启游乐场_shell_quit......