HarmonyOS鸿蒙Next中@Builder修饰的自定义构建函数中,可以传递另一个@Builder修饰的自定义构建函数吗?
HarmonyOS鸿蒙Next中@Builder修饰的自定义构建函数中,可以传递另一个@Builder修饰的自定义构建函数吗?
[@Builder](/user/Builder)
buildTitleWithChild(title: string, [@Builder](/user/Builder) childBuilder: () => void) {}
在同一个组件中,buildTitleWithChild()方法会被多处调用。其中childBuilder参数需要接收不同的自定义UI函数。请问是否可以在不同调用处传递不同的childBuilder实现?注意这里讨论的是同一组件内的调用,不涉及父子组件之间的传递。
更多关于HarmonyOS鸿蒙Next中@Builder修饰的自定义构建函数中,可以传递另一个@Builder修饰的自定义构建函数吗?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
4 回复
尝试了下按上面这种写法无法实现,编译会有报错,提供两种方案,楼主看下是否可行?
方案一:封装子组件,结合BuilderParam来实现,示例代码如下:
@Component
struct Child {
@Builder customBuilder() {};
@BuilderParam customBuilderParam: () => void = this.customBuilder;
build() {
Column() {
this.customBuilderParam()
}
}
}
@Builder
function aBuilder() {
Text('hello a')
}
@Builder
function bBuilder() {
Text('hello b')
}
// 调用
Child({
customBuilderParam: aBuilder
})
Child({
customBuilderParam: bBuilder
})
方案二:通过WrappedBuilder将自定义UI函数全部封装为全局builder,在组件内需要的地方使用,示例代码如下:
@Builder
function MyBuilder(value: string, size: number) {
Text(value)
.fontSize(size)
}
@Builder
function YourBuilder(value: string, size: number) {
Text(value)
.fontSize(size)
.fontColor(Color.Pink)
}
const builderArr: WrappedBuilder<[string, number]>[] = [wrapBuilder(MyBuilder), wrapBuilder(YourBuilder)];
@Builder
function testBuilder() {
builderArr[0].builder('Hello World', 30);
builderArr[1].builder('Hello World', 50);
}
// 调用
build() {
Column() {
Row() {
Column() {
this.testBuilder()
}
.width('100%')
}
.height('100%')
}
}
更多关于HarmonyOS鸿蒙Next中@Builder修饰的自定义构建函数中,可以传递另一个@Builder修饰的自定义构建函数吗?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
可以啊,为啥不可以啊 0 0
在HarmonyOS Next中,@Builder修饰的自定义构建函数可以接收另一个@Builder函数作为参数。你给出的代码示例是完全可行的,可以在同一组件内的不同调用处传递不同的childBuilder实现。
具体来说:
- 这种设计模式允许你在同一组件内复用
buildTitleWithChild
函数,同时动态改变其子UI内容 - 每个调用点可以传入不同的@Builder函数作为
childBuilder
参数 - 这种传递是在编译时确定的,不会影响运行时性能
示例用法:
[@Builder](/user/Builder)
function BuilderA() {
Text('Builder A')
}
[@Builder](/user/Builder)
function BuilderB() {
Text('Builder B')
}
// 使用处
buildTitleWithChild('Title1', BuilderA)
buildTitleWithChild('Title2', BuilderB)
这种模式在需要复用UI结构但内容有差异的场景下非常有用。