管理中心
您当前正在浏览新版开发者文档中心,目录分类和层级有所调整。点击左侧当前文档分类名称前的“☰”图标,可切换文档分类。 了解新版目录
问题处理与运维开发与测试问题应用框架开发UI框架组件使用使用BuilderParam在父组件调用this的方法报错:Error message: undefined is not callable

使用BuilderParam在父组件调用this的方法报错:Error message: undefined is not callable

问题场景

在子组件Child中使用@BuilderParam参数时,如果在父组件中将父组件的builder函数传递给子组件,并在builder函数中调用父组件的方法,可能会出现Error message: undefined is not callable的错误。

问题代码如下:

收起
自动换行
深色代码主题
复制
  1. @Component
  2. struct Child {
  3. @Builder
  4. FunABuilder0() {};
  5. @BuilderParam aBuilder0: () => void = this.FunABuilder0;
  6. build() {
  7. Column() {
  8. this.aBuilder0()
  9. }
  10. }
  11. }
  12. @Entry
  13. @Component
  14. struct Parent {
  15. @Builder
  16. componentBuilder() {
  17. Text('Parent builder')
  18. .onClick(() => {
  19. this.test1();
  20. })
  21. }
  22. test1(): void {
  23. console.info('test1');
  24. }
  25. build() {
  26. Column() {
  27. Child({ aBuilder0: this.componentBuilder })
  28. }
  29. }
  30. }

解决方案

在JavaScript中调用this时,需要注意this的指向。当前代码在子组件中声明builder方法时,this指向的是父组件。而@Builder componentBuilder()通过this.componentBuilder的形式传给子组件@BuilderParam customBuilderParam,此时this指向的是子组件Child的label,即 “Child”。因此,在点击事件响应时,this指向的是Child,而Child中没有test1()方法,从而导致 JavaScript 错误。

为了解决这个问题,需要在父组件中声明子组件时,通过监听函数将 `this` 传递到子组件。应改为:

收起
自动换行
深色代码主题
复制
  1. Child({
  2. aBuilder0: () => {
  3. this.componentBuilder()
  4. }
  5. })

参考链接

@BuilderParam装饰器:引用@Builder函数