《鸿蒙HarmonyOS 5.0开发教程》基础篇11:父子组件通信

父子组件通信,指的是父组件与子组件之间的数据传递或数据共享。

其中,父组件传递数据的方式只有 1 种,但子组件接收数据的方式有以下 3 种:

  • 普通变量:初始渲染同步
  • @Prop装饰器:父子单向同步
  • @Link装饰器:父子双向同步

一、数据传递

1、子组件接收数据

在子组件中,我们可以通过 3 种方式来接收父组件传递的数据。

示例代码:

ts 复制代码
@Component
export struct ChildComponent {
  username: string = "张三";  // 普通变量
  @Prop age: number = 20;     // @Prop
  @Link gender: string;       // @Link

  build() {
    Column() {
      Text("子组件渲染数据:")
      Text(this.username)
      Text(`${this.age}`)
      Text(this.gender)
    }
  }
}

注意:

  • 普通变量:必须设置初始值
  • @Prop:初始值可有可无
  • @Link:不能设置初始值

2、父组件传递数据

我们在父组件中通过 @State 定义出组件内部数据,父组件可以通过 Text 渲染这些数据,也可以把这些数据传递给子组件,在子组件中进行渲染。

不管子组件如何接收数据,父组件在调用渲染子组件时,都是以对象的形式向子组件传递数据:

ts 复制代码
import { ChildComponent } from '../components/ChildComponent'

@Entry
@Component
struct MyPage {
  @State username: string = "李华";
  @State age: number = 12;
  @State gender: string = "女"

  build() {
    Column() {
      Text("父组件渲染数据:")
      Text(this.username)
      Text(`${this.age}`)
      Text(this.gender)
      // 渲染子组件,同时传递数据给子组件
      ChildComponent({
        username: this.username,
        age: this.age,
        gender: this.gender
      })
    }
  }
}

二、数据修改

父子组件之间传递了数据后,父组件或者子组件都可以对数据进行修改,但修改后,会有一些不同的效果。

1、父组件修改数据

如果在父组件中修改了 @State 数据,首先父组件 自己的UI组件会全部更新 。同时,子组件中通过@Prop和@Link接收的数据,会随着父组件数据的修改而更新,但普通变量接收的数据不会更新

ts 复制代码
build() {
  Column() {
    Text("父组件渲染数据:")
    Text(this.username)
    Text(`${this.age}`)
    Text(this.gender)
    
    Button("父组件修改数据").onClick((event: ClickEvent) => {
      this.username = "张三";
      this.age = 18;
      this.gender = "男";
    })
    
    ChildComponent({
      username: this.username,
      age: this.age,
      gender: this.gender
    })
  }
}

代码执行后效果如下:

2、子组件修改数据

除了父组件可以修改自己的数据外,子组件也可以修改接收到的数据。子组件修改了数据后,页面变化如下:

  • 子组件中普通变量 接收的数据,修改后父子组件都不会更新(初始渲染同步)
  • 子组件中**@Prop接收的数据,修改后子组件更新,父组件不会更新(单向同步)**;
  • 子组件中**@Link接收的数据,修改后子组件更新,父组件也会更新(双向同步)**;

子组件示例代码如下:

ts 复制代码
build() {
  Column() {
    Text("子组件渲染数据:")
    Text(this.username)
    Text(`${this.age}`)
    Text(this.gender)
    
    Button('子组件修改数据').onClick((event: ClickEvent) => {
      this.username = "王五";
      this.age = 20;
      this.gender = "保密";
    })
  }
}

代码执行后效果如下:

相关推荐
威哥爱编程2 小时前
【鸿蒙开发案例篇】鸿蒙6.0的pdfService与pdfViewManager终极爆破
harmonyos·arkts·arkui
kirk_wang8 小时前
Flutter 三方库在 OHOS 平台的适配实践:以 flutter_mailer 为例
flutter·移动开发·跨平台·arkts·鸿蒙
qq 1808095111 小时前
无人船的Smith - PID跟踪控制探索
harmonyos
ok406lhq12 小时前
[鸿蒙2025领航者闯关] 我的鸿蒙SDK领航者养成记
华为·harmonyos·鸿蒙2025领航者闯关·鸿蒙6实战·开发者年度总结
嗝o゚15 小时前
Flutter 到鸿蒙开发:3个月技能迁移指南
flutter·华为·harmonyos
二流小码农16 小时前
鸿蒙开发:上架困难?谈谈我的上架之路
android·ios·harmonyos
luxy200416 小时前
HarmonyOS 5.0 AT指令4G透传控制器
华为·harmonyos
御承扬17 小时前
鸿蒙原生系列之动画效果(属性动画)
华为·harmonyos·动画效果
江澎涌18 小时前
JWorker——一套简单易用的基于鸿蒙 Worker 的双向 RPC 通讯机制
typescript·harmonyos·arkts
晚霞的不甘18 小时前
Flutter + OpenHarmony 国际化与无障碍(i18n & a11y)深度实践:打造真正包容的鸿蒙应用
flutter·华为·harmonyos