Harmony OS 父子组件传参

Harmony OS 父子组件传参案例

一、@Prop:从父组件单向同步状态

类似于vue的prop传参,只能父组件传参给子组件

当点击父组件的按钮时,改变message值,参数跟着更新。并且子组件也跟着更新(前提是要子组件加上@prop装饰器并且参数名称一致)。

当点击子组件按钮想要改变message时,父组件的message改变不了,只能改变子组件的参数

父组件代码:

import propTest from "../view/propTest"
@Entry
@Component
struct UseProp {
  @State message: string = '父组件prop'
   build() {

    Column() {
      Text(this.message)
        .fontSize(22)
        .fontWeight(FontWeight.Bold)
      propTest({
        message:this.message
      })
      Button('父组件按钮--变').onClick((event: ClickEvent) => {
          this.message="父组件事件触发-变"
      })
    }
    .width('100%')
 
  }
 
}

子组件代码:

@Component
export default struct propTest {
  @Prop message: string ;
  build() {
    Column() {
      Text(this.message)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .fontColor(Color.Green)

      Button('子组件按钮').onClick((event: ClickEvent) => {
        this.message="子组件变化"
      })
        .backgroundColor(Color.Green)
    }
    .width('100%')
  }
   
}

图1.运行时效果图                  图2.点击父组件按钮时                    图3.点击子组件按钮时

二、与父组件双向同步状态:@Link

若是父子组件状态需要相互绑定进行双向同步时,可以使用@Link装饰器。父组件中用于初始化子组件@Link变量的必须是在父组件中定义的状态变量。

当父组件点击按钮时 父子组件的参数同时会+2

当子组件点击按钮时 父子组件的参数同时会-1

这样就实现了数据双向同步(注意传参$clickIndex加$。完成在父子组件中定义状态后,最关键的就是要建立父子组件的双向关联关系。在父组件中使用子组件时,将父组件的clickIndex传递给子组件的clickIndex。其中父组件的clickIndex加上$表示传递的是引用)

import propTest from "../view/propTest"
@Entry
@Component
struct UseProp {
  @State message: string = '父组件prop'
  @State clickIndex: number = 0
  build() {

    Column() {
      Text('clickIndex:'+this.clickIndex)
        .fontSize(40)
        .fontWeight(FontWeight.Bold)
        .fontColor(Color.Brown)
      Button('爸爸+2').onClick((event: ClickEvent) => {
          this.clickIndex+=2
      })
        .backgroundColor(Color.Brown)
      propTest({
        message:this.message,
        clickIndex:$clickIndex
      })
    }
    .width('100%')
  }
}

子组件

@Component
export default struct propTest {
  @Prop message: string ;
  @Link clickIndex:number;
  build() {

    Column() {
      Text('clickIndex:'+this.clickIndex)
        .fontSize(40)
        .fontWeight(FontWeight.Bold)
        .fontColor(Color.Green)
      Button('儿子-1').onClick((event: ClickEvent) => {
        this.clickIndex-=1
      })
        .backgroundColor(Color.Green)
    }
    .width('100%')
  }
   
}

拓展:@watch监听属性

将上述的子组件的clickIndex加上监听器,当clickIndex变化时触发自定义回调函数onClickIndexChanged。函数可以加自己逻辑,比如现在是当clickIndex要小于0时会弹出提示,并且不能为负数。

注意:watch不仅仅是能监听 link修饰符的参数的,@State 、@prop其他的修饰符也能监听

import prompt from '@system.prompt';
@Component
export default struct propTest {
  @Prop message: string ;
  @Link @Watch('onClickIndexChanged') clickIndex:number;
  onClickIndexChanged(){
    if(this.clickIndex<0){
      prompt.showToast({
        message:"数量不能小于0"
      })
      this.clickIndex=0
    }

  }
  build() {

    Column() {
      Text('clickIndex:'+this.clickIndex)
        .fontSize(40)
        .fontWeight(FontWeight.Bold)
        .fontColor(Color.Green)
      Button('儿子-1').onClick((event: ClickEvent) => {
        this.clickIndex-=1
      })
        .backgroundColor(Color.Green)
    }
    .width('100%')
  }
   
}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三线码工

码字不易,有钱打赏,没打钱点赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值