HarmonyOS 鸿蒙Next @BuilderParam 不能作为bindMenu的参数吗?

HarmonyOS 鸿蒙Next @BuilderParam 不能作为bindMenu的参数吗?

@Entry
@Component
struct Parent {
  label: string = 'Parent'

  @Builder
  buildT() {
    Text(`[${this.label}]`).padding(10)
  }

  [@BuilderParam](/user/BuilderParam)
  buildP: CustomBuilder = this.buildT

  build() {
    Column() {
      Button("点击弹出菜单").bindMenu(this.buildT) // 成功
      Button("点击弹出菜单").bindMenu(this.buildP) // 失败
    }
  }
}

更多关于HarmonyOS 鸿蒙Next @BuilderParam 不能作为bindMenu的参数吗?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

请问楼主解决了吗,我也遇到同样的问题

更多关于HarmonyOS 鸿蒙Next @BuilderParam 不能作为bindMenu的参数吗?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


![](https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/087/272/638/0260086000087272638.20240124092130.63981479567124707203383830817851:50001231000000:2800:5821397D32186A7AC7432199F024CE90F3B09EC5ACCA5DDF8B432708A4271AD5.png)

![](https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/087/272/638/0260086000087272638.20240124092156.91252171326956483748428009589253:50001231000000:2800:86BAC0FC847C21541EACBE58E8E711C9ED0B8F46EC6C3B0D7507E8C9A5F1C822.png)

解决了吗?

当开发者创建了自定义组件,并想对该组件添加特定功能时,例如在自定义组件中添加一个点击跳转操作。若直接在组件内嵌入事件方法,将会导致所有引入该自定义组件的地方均增加了该功能。为解决此问题,ArkUI引入了@BuilderParam装饰器,@BuilderParam用来装饰指向@Builder方法的变量,开发者可在初始化自定义组件时对此属性进行赋值,为自定义组件增加特定的功能。该装饰器用于声明任意UI描述的一个元素,类似slot占位符。

说明

从API version 9开始,该装饰器支持在ArkTS卡片中使用。

装饰器使用说明

初始化@BuilderParam装饰的方法

@BuilderParam装饰的方法只能被自定义构建函数(@Builder装饰的方法)初始化。

  • 使用所属自定义组件的自定义构建函数或者全局的自定义构建函数,在本地初始化@BuilderParam
[@Builder](/user/Builder) function GlobalBuilder0() {}

[@Component](/user/Component)
struct Child {
[@Builder](/user/Builder) doNothingBuilder() {}
[@BuilderParam](/user/BuilderParam) aBuilder0: () => void = this.doNothingBuilder;
[@BuilderParam](/user/BuilderParam) aBuilder1: () => void = GlobalBuilder0;
build(){}
}
  • 用父组件自定义构建函数初始化子组件@BuilderParam装饰的方法。
[@Component](/user/Component)
struct Child {
[@Builder](/user/Builder) FunABuilder0() {}
[@BuilderParam](/user/BuilderParam) aBuilder0: () => void = this.FunABuilder0;
build() {
Column() {
this.aBuilder0()
}
}
}

[@Entry](/user/Entry)
[@Component](/user/Component)
struct Parent {
[@Builder](/user/Builder) componentBuilder() {
Text(`Parent builder `)
}

build() {
Column() {
Child({ aBuilder0: this.componentBuilder })
}
}
}
把父组件的状态传给子组件是不成功的。

在HarmonyOS中,@BuilderParam是一个用于传递构建器函数的装饰器,通常用于组件间传递UI构建逻辑。bindMenu是用于绑定菜单项的方法,通常需要传递一个具体的菜单项构建器函数。

@BuilderParam不能直接作为bindMenu的参数,因为bindMenu需要一个具体的菜单项构建器函数,而@BuilderParam本身只是一个装饰器,用于标记某个函数可以作为构建器传递,而不是构建器本身。

要实现类似的功能,你需要将@BuilderParam装饰的函数直接传递给bindMenu,而不是传递@BuilderParam本身。例如:

@Builder
function myMenuBuilder() {
  // 构建菜单项的逻辑
}

@Entry
@Component
struct MyComponent {
  @BuilderParam menuBuilder: () => void = myMenuBuilder;

  build() {
    Column() {
      // 其他组件
    }
    .bindMenu(this.menuBuilder)
  }
}

在这个例子中,myMenuBuilder是一个具体的构建器函数,通过@BuilderParam装饰后传递给了bindMenu

总结:@BuilderParam不能直接作为bindMenu的参数,但可以通过@BuilderParam装饰的函数来传递构建器逻辑。

回到顶部