在 HarmonyOS 中,实现父组件中的变量值改变时,子组件中的值也跟着变化,可以通过 @Observed、@State 和 @Link 装饰器来实现。以下示例展示了如何实现这种双向绑定,使得父组件的状态变更能够自动更新子组件的显示。


示例代码

定义父组件


import { Observed } from 'ohos-data-binding';
import { Column, Text, Button, Component, ViewComponent } from 'ohos-jsb-hicore';

@Component
class ParentComponent extends ViewComponent {
  @Observed parentMessage: string = "Hello from Parent!";

  build() {
    Column() {
      // 显示父组件的消息
      Text(this.parentMessage)
        .margin({ top: 20 })
        .width('100%')
        .height(50);

      // 按钮用于修改父组件的消息
      Button("Update Message in Parent")
        .margin({ top: 20 })
        .onClick(() => {
          this.parentMessage = "Parent updated the message!";
        });

      // 引入子组件并传递父组件的信息
      ChildComponent()
        .message(this.parentMessage);
    }
  }
}

定义子组件


import { Link } from 'ohos-data-binding';
import { Column, Text, Button, Component, ViewComponent } from 'ohos-jsb-hicore';

@Component
class ChildComponent extends ViewComponent {
  @Link message!: string;  // 使用 @Link 接受并反映父组件的状态

  build() {
    Column() {
      // 显示子组件接收到的父组件消息
      Text(this.message)
        .margin({ top: 20 })
        .width('100%')
        .height(50);

      // 按钮用于修改父组件的消息
      Button("Update Message in Child")
        .margin({ top: 20 })
        .onClick(() => {
          this.message = "Child updated the message!";
        });
    }
  }
}

关键点解释

@Observed:


用于父组件声明一个可观察的数据变量 parentMessage。

当这个变量发生变化时,会触发绑定的子组件重新渲染。

@Link:


子组件通过 @Link 修饰符接收从父组件传递的数据变量 message。

@Link 允许子组件访问和反映父组件的数据,从而实现同步更新。


数据绑定机制:


父组件将自身的状态变量 parentMessage 通过属性传递给子组件。

子组件使用 @Link 接收并绑定该状态变量,这意味着当父组件的 parentMessage 发生变化时,子组件中的 message 会自动更新。


用户交互:


父组件和子组件各有一个按钮,用于展示如何通过用户交互修改状态,并反映在两个组件中。

通过点击按钮,父组件或子组件可以更新变量,从而触发另一方组件的重新渲染。


总结

通过上述示例代码,可以看到如何利用 @Observed 和 @Link 实现父组件与子组件之间的双向绑定。当父组件中的状态变量改变时,子组件中的相应变量会自动更新,以确保双方数据的一致性。这样可以显著提高组件间通信的效率和代码的可维护性。