《鸿蒙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 = "保密";
    })
  }
}

代码执行后效果如下:

相关推荐
Li_Ning218 小时前
vue3+uniapp开发鸿蒙初体验
华为·uni-app·harmonyos
特立独行的猫a9 小时前
HarmonyOS NEXT边学边玩:从零实现一个影视App(七、今日票房页面的设计与实现)
华为·harmonyos
李洋-蛟龙腾飞公司11 小时前
华为支付-(可选)特定场景配置操作
华为·harmonyos
李洋-蛟龙腾飞公司11 小时前
华为支付接入规范
华为·harmonyos
程序猿阿伟12 小时前
《探秘鸿蒙Next:非结构化数据处理与模型轻量化的完美适配》
华为·harmonyos
HarmonyOS_SDK14 小时前
巧用多目标识别能力,帮助应用实现智能化图片解析
harmonyos
蓝枫amy1 天前
HarmonyOS快速入门
华为·harmonyos
程序猿阿伟1 天前
《探秘鸿蒙Next:如何保障AI模型轻量化后多设备协同功能一致》
人工智能·华为·harmonyos
程序猿阿伟1 天前
《探秘鸿蒙Next:人工智能助力元宇宙高效渲染新征程》
人工智能·华为·harmonyos