HarmonyOS 鸿蒙Next:如何在子组件中使用父组件UI,并将子组件的值传入实时渲染更新?

发布于 1周前 作者 htzhanglong 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:如何在子组件中使用父组件UI,并将子组件的值传入实时渲染更新?

比如说有这样一种场景,我要维护之前别人写的代码,并且加入一些子模块。但是我新加的这个子模块的内容和主页面的一个@Builder修饰的UI完全一样。在不改变原有逻辑的基础上,除了将这个UI块用@Component定义抽离出来复用。我怎样在子组件使用 @BuilderParam 去将子组件的值传入这个@Builder修饰的UI中并且实时更新(目前只会初始化将参数传过去,也就是渲染一次)。刚入手这个还不太清除渲染规则,求大佬解答。
 

这是父组件index.ets的代码:

import CounterExe from ‘./components/counter’;

@Entry

@Component

struct Index {

  @Builder test(value:number){

    Column(){

      Text(‘builder渲染测试:’+value.toString())

      Test({ value })

    }.alignItems(HorizontalAlign.Start)

  }

  build() {

    Column() {

      List() {

        ListItem() {

          Column() {

            CounterExe({

              container:()=>{},

              container1:this.test,

            })

          }.width(‘100%’)

        }

      }

      .width(‘100%’).height(‘100%’)

    }

    .height(‘100%’)

  }

}

@Component

struct Test{

  @Prop @Watch(‘onChange’)value:number;

  onChange(){

    console.log(this.value.toString())

  }

  build(){

    Text(‘builder内嵌组件渲染测试:’+this.value.toString())

  }

}

这是子组件的counter.ets代码:

@Component

export default struct CounterExe {

  @State value: number = 1

  @BuilderParam container: () => void // 用于占位

  @BuilderParam container1: (value: number) => void // 用于实际传递参数,但只会初始化渲染

  build() {

    Column() {

      Counter() {

        Text(this.value.toString())

      }

      .margin(100)

      .onInc(() => {

        this.value++

      })

      .onDec(() => {

        this.value–

      })

      .enableInc(this.value < 9)

      .enableDec(this.value > 1)

      Column({space:10}) {

        Text(‘子组件内值:’ + this.value.toString())

        this.container()

        this.container1(this.value)

      }.alignItems(HorizontalAlign.Start)

    }

  }

}

为什么子组件中this.container1渲染的value当组件内value更新时始终不会变,或者有什么办法可以实现这种场景下的数据同步?

3 回复
请问这个问题,你解决了嘛

在HarmonyOS鸿蒙Next系统中,若想在子组件中使用父组件的UI元素,并将子组件的值实时传入并渲染更新,可以通过以下方式实现:

  1. 父子组件通信:利用@Entry@Component注解定义父子组件,通过Intent或数据绑定机制(如MVVM模式中的ViewModel)实现父子组件之间的数据传递。父组件通过属性将UI元素的数据传递给子组件。

  2. 监听数据变化:子组件接收来自父组件的数据后,使用数据监听机制(如Observer模式)监听数据的变化。一旦数据变化,子组件的UI将自动更新。

  3. 双向数据绑定:在HarmonyOS中,可以通过双向数据绑定机制(类似于Vue或Angular中的双向绑定)实现子组件向父组件的数据反馈,从而实现实时渲染更新。

  4. 自定义组件:如果父组件的UI元素较为复杂,可以考虑将其封装为自定义组件,并在子组件中通过引用该自定义组件的方式实现复用和数据传递。

综上所述,通过合理的父子组件通信机制、数据监听和双向数据绑定,可以有效实现子组件中使用父组件UI元素,并实时更新子组件值的功能。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部