当前位置: 首页 > 知识库问答 >
问题:

harmonyos - HarmonyOS @Builder构造的自定义组件无法接受外部传递的箭头函数?

朱浩大
2024-07-10

如下面代码, @Builder构造的自定义组件无法接受外部传递的箭头函数

@Entry
@Component
export default struct FlowPlaybackPage {

  build() {
    Stack(){
      Custom({
        onClickEvent: () => {
          this.onClickEvent2()
        }
      })
    }
  }

  onClickEvent2 = ():void =>{
    console.log('onClickEvent2');
  }
}

@Component
export struct Custom{
  onClickEvent? : () => void

  @Builder renderBlank() {
    Column(){
      Button('Button')
        .height(50)
        .onClick(() => {
          //Builder方式自定义组件this
          this.onClickEvent?.()
        })
    }
  }

  build() {
    Stack(){
      CustomInner({
        builderCustom: this.renderBlank
      })
    }
  }
}

@Builder function bottomCustom() {}

@Component
export struct CustomInner {

  @BuilderParam builderCustom: () => void = bottomCustom;

  build() {
    Column(){
      this.builderCustom()
    }
  }
}

共有1个答案

洪浩波
2024-07-10

@Builder构造的自定义组件可以接受外部传递的箭头函数,但是由于@Builder又传递给了另一个自定义组件,this指向改变,在另一个自定义组件内无该方法。可将箭头函数继续传递。

参考demo:

@Entry
@Component
export default struct BuilderTest {
  build() {
    Stack() {
      Custom({
        onClickEvent:this.onClickEvent2
      })
    }
  }

  onClickEvent2 = (): void => {
    console.log('onClickEvent2');
  }
}

@Component
export struct Custom {
  onClickEvent?: () => void

  @Builder
  renderBlank() {
    Column() {
      Button('Button')
        .height(50)
        .onClick(() => {
          this.onClickEvent?.()
        })
    }
  }

  build() {
    Column() {
      CustomInner({
        customBuilderParam: this.renderBlank,
        onClickEvent:this.onClickEvent
      })
    }
  }
}

@Component
export struct CustomInner {
  onClickEvent?: () => void
  @Builder
  renderBlank() {
  }

  @BuilderParam customBuilderParam: () => void = this.renderBlank;

  build() {
    Column() {
      this.customBuilderParam()
    }
  }
}
 类似资料:
  • 问题内容: 鉴于此组件: 如何添加一个无需使用语法即可定义状态的构造函数? 问题答案: 由于它是一个无状态组件,因此没有组件生命周期。因此,您不能指定。 您必须进行扩展以创建有状态组件,然后需要一个构造函数,并且可以使用。 更新 由于阵营16.8.0和挂钩得到了引入有更多的选择。 挂钩是一项新的功能建议,使您无需编写类即可使用状态和其他React>功能。它们作为> v16.8.0的一部分在Reac

  • 子组件事件能否到传递父组件

  • 问题内容: 我有以下代码: 我一直期望这样做能够成功,因为MyType实现了MyInterface,但是我得到了: 不能将对象(类型 MyType)用作类型 MyInterface作为AcceptInterface的参数:* MyInterface是指向接口的指针,而不是接口 我尝试做类型断言:object。(MyInterface),但这也不起作用。 我该怎么做? 问题答案: 如错误所示, 不能

  • 我正在使用Java SDK在HarmonyOS中创建一个自定义组件,在那里我必须双击一些任务。但我无法检测到双击事件。 在Android中,借助GestureDetector类,我们可以检测双击事件,如下所示: 在HMOS中,我尝试使用Component.TouchEventListener检测双击,如下所示: 但是,它没有检测到双击。在双击也有打印单点击检测。

  • 前面提到的代码是从MDN修改的。这段代码没有任何意图,只是为了变量声明示例的目的。

  • 如何自定义Video组件控制栏样式