HarmonyOS 鸿蒙Next 父组件数据更新后,父组件的@Builder也已更新,但是子组件的@BuilderParam不更新

发布于 1周前 作者 eggper 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 父组件数据更新后,父组件的@Builder也已更新,但是子组件的@BuilderParam不更新

我的需求是子组件content用到父组件的插槽,当父组件数据更新时,子组件的content也要更新。 如下示例中,父组件数据和@Builder ContentView都已经更新了的,我希望把父组件的ContentView当成子组件的插槽传递。但是子组件不会更新。

import text from '@ohos.graphics.text';

interface GeneratedObjectLiteralInterface_1 {
  name: string;
  age: string;
}

[@Observed](/user/Observed)
class Tmp {
  text: string = "Hello"
}
[@Builder](/user/Builder) function customBuilder($$: Tmp) {
  Column() {
    Text($$.text)
      .fontSize(50)
  }
}

[@Entry](/user/Entry)
[@Component](/user/Component)
struct Parent {
  [@State](/user/State) detail: GeneratedObjectLiteralInterface_1 = {
    name: "盖伦",
    age: '18'
  }

  [@Builder](/user/Builder) ContentView($$: Tmp){
    Text($$.text)
  }


  build() {
    Column(){
      Text("父组件").fontColor("red").onClick(() => {
        this.detail = {
          name: Math.random().toString(36).slice(2,10),
          age: (Math.random()*20 + 10).toFixed(0)
        }
        console.log('1:',JSON.stringify(this.detail));
      })
      this.ContentView({text: this.detail.name})
      this.ContentView({text: this.detail.age})
      Child({
        title: "姓名",
        content: (): void => this.ContentView({text: this.detail.name})
      })
      Child({
        title: "年龄",
        content: (): void => this.ContentView({text: this.detail.age})
      })
    }.width("100%").backgroundColor('#eee')
  }
}

@Component struct  Child {

  @Prop title: string

  @BuilderParam content:()=>void = this.handleContent
  [@Builder](/user/Builder) handleContent() {
    Text("原始handleContent")
  }
  build() {
    Row(){
      Text("子组件-")
      Text(this.title+"=")
      this.content()
    }.backgroundColor('#999').margin(15)
  }
}
 

如果ContentView换一种写法,又是可以实现子组件也更新的,但是我不想这么做,因为本身抽离就是为了公共模块,会有太多if了

[@Builder](/user/Builder) ContentView($$: string){
    if($$==="name"){
        Text(this.detail.name)
    }else if($$==='age'){...}
  }
  <!--父元素调用-->
  Child({
        title: "姓名",
        content: (): void => this.ContentView("age")
      })
 

而如果把根据官网ContentView抽离到外层,又会报错Cannot read property observeComponentCreation2 of undefined

请各路大神指教指教。,感谢!!

3 回复
要把对应的$$所代表的类型传进去,他才会有反应啊

你好,我没明白你说的$$类型传进去是传进哪里去?劳烦解答。谢谢。

在HarmonyOS鸿蒙开发框架中,当父组件的数据通过@Builder更新后,理论上应该能够触发子组件中依赖于这些数据的部分进行更新。如果子组件的@BuilderParam没有按预期更新,这通常可能是由于以下几个原因:

  1. 数据绑定问题:确保子组件正确使用了@BuilderParam注解,并且该注解所引用的父组件数据确实已经更新。

  2. 组件生命周期:检查子组件是否在父组件数据更新时处于活动状态,有时候组件的销毁与重建可能会影响数据同步。

  3. 事件传递:确认父组件数据更新后是否有正确触发子组件的刷新机制,比如通过事件或观察者模式通知子组件。

  4. 数据缓存:检查是否存在数据缓存机制导致子组件接收到的数据未及时更新。

  5. 框架版本:确认使用的HarmonyOS SDK版本是否支持当前的开发需求,有时候框架的更新会修复此类问题。

如果上述检查均无误但问题依旧存在,可能是由于更复杂的框架内部逻辑或特定场景导致。此时,建议直接联系官方客服以获取更专业的技术支持。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部