鸿蒙装饰器的介绍

State装饰器,

State装饰的变量,称为状态变量,与声明式范式中的其他被装饰变量一样,是私有的,只能从组件内部访问,在声明时,必须指定其类型和本地初始化。

Provide装饰器和@Consume装饰器,

其中@provide装饰的变量是在祖先节点中,可以理解为被'提供'给后代的状态变量。@Consume装饰的变量是在后代组件中,去绑定祖先节点提供的变量。

@Provide和@Consume可以通过相同的变量名或者相同的变量别名绑定,变量类型必须相同

\ 复制代码
// 通过相同的变量名绑定
@Provide a: number = 0;
@Consume a: number;

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

实例

复制代码
// 孙组件
@Component
struct CountDownComponentB {
  @Consume count: number;
  build() {
    Column() {
      Text(`这是孙组件的值:${this.count},改变会影响到父组件。`)
      Row(){
        Button(`+1`).onClick(() => {
          this.count += 1
        })
        Button(`-1`).onClick(() => {
          this.count -= 1
        })
      }
      .justifyContent(FlexAlign.SpaceEvenly)
      .width("100%")
    }
  }
}

// 子组件
@Component
struct CountDownComponentA {
  build() {
    Column() {
      // 孙组件
      CountDownComponentB()
    }
  }
}


// 父组件
@Entry
@Component
struct ParentComponent {
  @Provide count: number = 10;

  build() {
    Column() {
      Text(`这是父组件的值:${this.count},改变会传给孙组件。`)
      Row(){
        Button(`+1`).onClick(() => {
          this.count += 1;
        })
        Button(`-1`).onClick(() => {
          this.count -= 1;
        })
      }
      .justifyContent(FlexAlign.SpaceEvenly)
      .width("100%")

      // 子组件
      CountDownComponentA()

    }
  }
}

watch装饰器:状态变量更改通知

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

当状态变量变化时,@watch回调方法将被调用。@watch在ARKUI框架内吧判断数值有无更新,使用的是严格相等===,当在严格相等为false的情况下,就会触发@watch的回调。

@watch可用于购物车计算总价,或者实现计算器功能等

(ChangedPropertyName?:string)=>void

建议开发者避免无限循环。循环可能是因为在@watch的回调方法里面直接或者间接地修改了同一个状态变量引起的,未来避免循环的产生,建议不要在@watch的回调方法里修改当前装饰的状态变量

/*

  • @Watch 修饰 状态数据
  • 函数中,不要修改被监视的状态变量。 我们要操作的是其他的业务逻辑
  • */
    @Entry
    @Component
    struct WatchDct {
    @State @Watch('change') count: number = 1
    @State @Watch('change') pow: number = 2
    @State res: number = 1

change() {

this.res = Math.pow(this.count, this.pow)

}

build() {

Row() {

Column() {

Text('基数:' + this.count)

.fontSize(50)

.onClick(() => {

this.count++

})

复制代码
    Divider()
    Text(`次幂:${this.pow}`)
      .fontSize(50)
      .onClick(() => {
        this.pow++
      })

    Divider()
    Text("结果:" + this.res)
      .fontSize(50)
  }
  .width('100%')
}
.height('100%')

}

}

相关推荐
晚霞的不甘8 分钟前
Flutter for OpenHarmony 引力弹球游戏开发全解析:从零构建一个交互式物理小游戏
前端·flutter·云原生·前端框架·游戏引擎·harmonyos·骨骼绑定
郝学胜-神的一滴12 分钟前
Python中的with语句与try语句:资源管理的两种哲学
linux·服务器·开发语言·python·程序人生·算法
SmartRadio26 分钟前
基于RK3568实现多电脑KVM共享方案(HDMI采集+虚拟USB键鼠+无缝切换+剪贴板/文件共享)
运维·服务器·网络·电脑·kvm·rk3568
未来之窗软件服务35 分钟前
服务器运维(二十五)终端安全证书管控与Nginx HTTPS 部署—东方仙盟练气期
运维·服务器·安全·仙盟创梦ide·东方仙盟
[H*]1 小时前
Positioned高级定位技巧
flutter·华为·harmonyos
倾国倾城的反派修仙者1 小时前
鸿蒙开发——使用弹窗授权保存媒体库资源
开发语言·前端·华为·harmonyos
b2077211 小时前
Flutter for OpenHarmony 身体健康状况记录App实战 - 数据导出实现
python·flutter·harmonyos
qq_229058011 小时前
Docker常用命令
linux·服务器·docker
是个西兰花1 小时前
进程间通信:匿名管道
linux·运维·服务器
爱吃泡芙的小白白1 小时前
使用Cursor来进行连接SSH远程主机中出现的问题(自用)
服务器·学习·ssh·cursor