HarmonyOS | 状态管理(三) | @Link装饰器

系列文章目录

1.HarmonyOS | 状态管理(一) | @State装饰器
2.HarmonyOS | 状态管理(二) | @Prop装饰器


文章目录


前言

现在通过上面两篇的状态管理装饰器讲解,应该越来越清楚状态装饰器的作用了

上篇 HarmonyOS | 状态管理(二) | @Prop装饰器 讲解了父子单向同步 ,这篇文章讲解 @Link装饰器:父子双向同步


提示:以下是本篇文章正文内容,下面案例可供参考

一、@Link装饰器是什么?

子组件中被@Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。

二、限制条件

@Link装饰器不能在@Entry装饰的自定义组件中使用。

二、使用场景

typescript 复制代码
class GreenButtonState {
  width: number = 0;

  constructor(width: number) {
    this.width = width;
  }
}

@Component
struct GreenButton {
  @Link greenButtonState: GreenButtonState;

  build(){
    Button('Green Button')
      .width(this.greenButtonState.width)
      .height(40)
      .backgroundColor('#64bb5c')
      .fontColor('#FFFFFF,90%')
      .onClick(() => {
          if(this.greenButtonState.width < 700){
               this.greenButtonState.width += 60;
          }else{
               this.greenButtonState = new GreenButtonState(200);
          }
      })
  }
}

@Component
struct YellowButton {
  @Link yellowButtonState: number;

  build() {
    Button('Yellow Button')
      .width(this.yellowButtonState)
      .height(40)
      .backgroundColor('#f7ce00')
      .fontColor('#FFFFFF,90%')
      .onClick(() => {
         this.yellowButtonState += 40.0;
      })
  }
}


@Entry
@Component
struct ShufflingContainer {
  @State greenButtonState: GreenButtonState = new GreenButtonState(200);
  @State yellowButtonProp: number = 200;

  build() {
     Column(){
       Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) {
         Button('Parent View: Set yellowButton')
           .width(312)
           .height(40)
           .margin(12)
           .fontColor('#FFFFFF,90%')
           .onClick(() => {
               this.yellowButtonProp = (this.yellowButtonProp < 700) ? this.yellowButtonProp + 40 : 100;
           })

         Button('Parent View: Set GreenButton')
           .width(312)
           .height(40)
           .margin(12)
           .fontColor('#FFFFFF,90%')
           .onClick(() => {
             this.greenButtonState.width = (this.greenButtonState.width < 700) ? this.greenButtonState.width + 100 : 100;
           })

         GreenButton({ greenButtonState:$greenButtonState }).margin(12)

         YellowButton({ yellowButtonState:$yellowButtonProp }).margin(12)
       }
     }
  }
}

1.点击子组件GreenButton和YellowButton中的Button,子组件会发生相应变化,将变化同步给父组件。因为@Link是双向同步,会将变化同步给@State。

2.当点击父组件ShufflingContainer中的Button时,@State变化,也会同步给@Link,子组件也会发生对应的刷新。

typescript 复制代码
@Component
struct  Child{
   @Link items:number[];

   build(){
     Column() {
       Button(`Button1: push`)
         .margin(12)
         .width(312)
         .height(40)
         .fontColor('#FFFFFF,90%')
         .onClick(() => {
            this.items.push(this.items.length + 1)
         })

       Button(`Button2: replace whole item`)
         .margin(12)
         .width(312)
         .height(40)
         .fontColor('#FFFFFF,90%')
         .onClick(() => {
            this.items = [100,200,300,400,500]
         })
     }
   }
}

@Entry
@Component
struct Parent {
  @State arr: number[] = [1, 2, 3];

  build() {
    Column() {
       Child({ items: $arr }).margin(12)

       ForEach(this.arr,(item:number) =>{
          Button(`${item}`)
            .margin(12)
            .width(312)
            .height(40)
            .backgroundColor('#11a2a2a2')
            .fontColor('#e6000000')
       },(item: ForEachInterface) => item.toString())
    }
  }
}

ArkUI框架可以观察到数组元素的添加,删除和替换。在该示例中@State和@Link的类型是相同的number[]

相关推荐
Damon小智5 小时前
HarmonyOS NEXT 技术实践-基于基础视觉服务的多目标识别
华为·harmonyos
匹马夕阳8 小时前
华为笔记本之糟糕的体验
华为·笔记本电脑
egekm_sefg8 小时前
华为、华三交换机纯Web下如何创关键VLANIF、操作STP参数
网络·华为
岳不谢1 天前
华为DHCP高级配置学习笔记
网络·笔记·网络协议·学习·华为
爱笑的眼睛111 天前
uniapp 极速上手鸿蒙开发
华为·uni-app·harmonyos
K.P1 天前
鸿蒙元服务从0到上架【第三篇】(第二招有捷径)
华为·harmonyos·鸿蒙系统
K.P1 天前
鸿蒙元服务从0到上架【第二篇】
华为·harmonyos·鸿蒙系统
敲代码的小强1 天前
Flutter项目兼容鸿蒙Next系统
flutter·华为·harmonyos
程序猿会指北1 天前
纯血鸿蒙APP实战开发——Text实现部分文本高亮和超链接样式
移动开发·harmonyos·arkts·openharmony·arkui·组件化·鸿蒙开发
鸿蒙自习室1 天前
鸿蒙开发——关系型数据库的基本使用与跨设备同步
前端·数据库·华为·harmonyos·鸿蒙