鸿蒙组件数据传递:ui传递、@prop、@link

鸿蒙组件数据传递方式有很多种,下面详细罗列一下:

注意:
文章内名词解释:
正向:父变子也变 逆向:子变父也变

**第一种:直接传递

- 特点:1、任何数据类型都可以传递 2、不能响应式更新 (正向 逆向都不行) 3、适合纯ui渲染** 4、子组件需要初始化数据

@Entry
@Component
struct Demo04 {
  @State message: string = 'Hello World123'
  @State obj: Aa = {
    name: 'zhangsan'
  }

  build() {
    Row() {
      Column() {
        Text("基本数据类型")
        Son({ message: this.message })
        Divider().strokeWidth(2)
        Text("对象数据类型")
        Son({ obj:this.obj })
        Button('改变数据').onClick((event: ClickEvent) => {
          this.message = '666'
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}

@Component
struct Son {
  message: string = ''
  obj:Aa = {name:''}
  build() {
    Row() {
      Text(this.message)
      Text(this.obj.name)
    }
  }
}

class Aa{
  name: string = ''
}

第二种:@prop传递

特点:1、只能传递基本数据类型 2、可以正向的响应式数据更新 3、适合父组件改变子组件数据,但是子组件无法改变父组件数据的需求 4、子组件不需要初始化数据

@Entry
@Component
struct Demo04 {
  @State message: string = 'Hello World123'
  @State obj: Aa = {
    name: 'zhangsan'
  }

  build() {
    Row() {
      Column() {
        Text(this.message)
        Button('改变数据').onClick((event: ClickEvent) => {
          this.message = '666'
        })
          .margin({
            bottom:20
          })
        Divider().strokeWidth(5)
        Text("基本数据类型")
        Son({ message: this.message })
        Divider().strokeWidth(2)
        Text("对象数据类型")
        // Son({ obj:this.obj })

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

@Component
struct Son {
  @Prop message:string
  // @Prop obj:Aa
  build() {
    Row() {
      Text(this.message)
      // Text(this.obj.name)
      Button("逆向改变").onClick(() => {
        this.message = "子变父不变"
        // this.obj.name = "子变父不变"
      })
    }
  }
}

class Aa{
  name: string = ''
}

第二种:@link传递

特点:1、任何数据类型都可以 2、可以正向和逆向的响应式数据更新 3、适合子父组件一起更新数据的需求 4、子组件不需要初始化数据

@Entry
@Component
struct Demo04 {
  @State message: string = 'Hello World123'
  @State obj: Aa = {
    name: 'zhangsan'
  }

  build() {
    Row() {
      Column() {
        Text(this.message)
        Text(this.obj.name)
        Button('改变数据').onClick((event: ClickEvent) => {
          this.message = '666'
          this.obj.name = "lisi123"
        })
          .margin({
            bottom:20
          })
        Divider().strokeWidth(5)
        Text("基本数据类型")
        Son({message:$message})
        Divider().strokeWidth(2)
        Text("对象数据类型")
        // Son({obj:$obj})
      }
      .width('100%')
    }
    .height('100%')
  }
}

@Component
struct Son {
  @Link message:string
  // @Link obj:Aa
  build() {
    Row() {
      Text(this.message)
      // Text(this.obj.name)
      Button("逆向改变").onClick(() => {
        this.message = "子变父不变"
        // this.obj.name = "子变父不变"
      })
    }
  }
}

class Aa{
  name: string = ''
}

鸿蒙-传智播客-博学谷

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值