[HarmonyOS][K老师]@Builder 里的 this 指向问题: 原创
头像 K老师 2026-01-14 14:36:35    发布
2893 浏览 38 点赞 0 收藏

​Parent 组件给 Children 组件,传递了 @BuilderParam, 这个自定义构建函数里的 this,指向谁?
有两种情况:
1,如果用 @Builder 装饰的,指向 Children

2,如果用 @LocalBuilder 装饰的,指向 Parent

我们需要详细解释这两种情况,并总结提炼。 背景知识:

- @Builder装饰器:用于定义一个自定义构建函数,可以在组件内定义(局部)或在全局定义(全局构建函数)。

- @BuilderParam属性装饰器:用于子组件中,表示该属性可以接收一个自定义构建函数,由父组件传递。

关键点:在构建函数内部,`this`的指向取决于构建函数的定义位置和传递方式。

情况1:使用全局的@Builder(或者组件外的@Builder)定义构建函数,然后传递给子组件的@BuilderParam。


 // 全局构建函数
      @Builder function globalBuilderFunction() {
        // 这里的this指向谁?
      }
      @Entry
      @Component
      struct Parent {
        build() {
          Column() {
            Children({ builderParam: globalBuilderFunction })
          }
        }
      }
      @Component
      struct Children {
        @BuilderParam builderParam: () => void
        build() {
          this.builderParam()
        }
      }
      

在这种情况下,全局构建函数中的`this`在调用时指向子组件(Children)的实例。因为全局构建函数独立于任何组件,当在子组件中被调用时,其执行上下文是子组件。

情况2:使用局部自定义构建函数(在父组件内部使用@Builder定义)传递给子组件的@BuilderParam。


@Entry
      @Component
      struct Parent {
        @Builder localBuilderFunction() {
          // 这里的this指向谁?
        }
        build() {
          Column() {
            Children({ builderParam: this.localBuilderFunction })
          }
        }
      }
      @Component
      struct Children {
        @BuilderParam builderParam: () => void
        build() {
          this.builderParam()
        }
      }
      


在这种情况下,局部构建函数中的`this`在定义时就已经绑定到父组件(Parent)的实例。因为局部构建函数是作为父组件的一个方法,它内部的`this`指向父组件实例。即使传递给子组件并在子组件中调用,它仍然保持对父组件的引用。


总结: - 全局构建函数(定义在组件外)中的`this`在子组件中调用时,指向子组件实例。 - 局部构建函数(定义在父组件内)中的`this`始终指向父组件实例,无论在哪里调用。 注意:在ArkUI中,组件的`this`指向当前组件的实例,可以访问该组件的状态变量、方法等。

注意:在ArkUI中,组件的`this`指向当前组件的实例,可以访问该组件的状态变量、方法等。

因此,我们可以提炼如下:

1. 全局自定义构建函数(使用@Builder定义在组件外): 当传递给子组件的@BuilderParam并在子组件中调用时,函数体内的`this`指向子组件实例(即Children组件实例)。

2. 局部自定义构建函数(使用@Builder定义在父组件内): 当传递给子组件的@BuilderParam时,函数体内的`this`仍然指向父组件实例(即Parent组件实例),因为该函数是在父组件的上下文中创建的。


©本站发布的所有内容,包括但不限于文字、图片、音频、视频、图表、标志、标识、广告、商标、商号、域名、软件、程序等,除特别标明外,均来源于网络或用户投稿,版权归原作者或原出处所有。我们致力于保护原作者版权,若涉及版权问题,请及时联系我们进行处理。
分类
HarmonyOS

暂无评论数据

发布

头像

K老师

大家好我是K老师,这是我的个人介绍:鸿蒙先锋,鸿蒙开发者达人,鸿蒙应用架构师,HDG组织者,可0-1开发纯血鸿蒙应用,可0-1开发前端加鸿蒙混合应用,可0-1开发PC端鸿蒙应用。

118

帖子

0

提问

1412

粉丝

关注
热门推荐
地址:北京市朝阳区北三环东路三元桥曙光西里甲1号第三置业A座1508室 商务内容合作QQ:2291221 电话:13391790444或(010)62178877
版权所有:电脑商情信息服务集团 北京赢邦策略咨询有限责任公司
声明:本媒体部分图片、文章来源于网络,版权归原作者所有,我司致力于保护作者版权,如有侵权,请与我司联系删除
京ICP备:2022009079号-2
京公网安备:11010502051901号
ICP证:京B2-20230255