1# wrapBuilder:封装全局@Builder 2 3 4 全局\@Builder作为wrapBuilder的参数返回WrappedBuilder对象,实现[全局\@Builder](arkts-builder.md#全局自定义构建函数)可以进行赋值和传递。 5 6 7> **说明:** 8> 9> 从API version 11开始使用。 10 11## 接口说明 12 13wrapBuilder是一个模板函数,返回一个`WrappedBuilder`对象。 14 15```ts 16declare function wrapBuilder< Args extends Object[]>(builder: (...args: Args) => void): WrappedBuilder; 17``` 18同时 `WrappedBuilder`对象也是一个模板类。 19 20```ts 21declare class WrappedBuilder< Args extends Object[]> { 22 builder: (...args: Args) => void; 23 24 constructor(builder: (...args: Args) => void); 25} 26``` 27 28 29>说明:模板参数`Args extends Object[]`是需要包装的builder函数的参数列表 30 31使用方法: 32 33```ts 34let builderVar: WrappedBuilder<[string, number]> = wrapBuilder(MyBuilder) 35let builderArr: WrappedBuilder<[string, number]>[] = [wrapBuilder(MyBuilder)] //可以放入数组 36``` 37 38 39 40## 限制条件 41 42wrapBuilder方法只能传入[全局\@Builder](arkts-builder.md#全局自定义构建函数)方法。 43 44wrapBuilder方法返回的WrappedBuilder对象的builder属性方法只能在struct内部使用。 45 46 47 48## 使用场景1 49 50将wrapBuilder赋值给globalBuilder,且把MyBuilder作为wrapBuilder参数,用来替代MyBuilder不能直接赋值给globalBuilder。 51 52```ts 53@Builder 54function MyBuilder(value: string, size: number) { 55 Text(value) 56 .fontSize(size) 57} 58 59let globalBuilder: WrappedBuilder<[string, number]> = wrapBuilder(MyBuilder); 60 61@Entry 62@Component 63struct Index { 64 @State message: string = 'Hello World'; 65 66 build() { 67 Row() { 68 Column() { 69 globalBuilder.builder(this.message, 50) 70 } 71 .width('100%') 72 } 73 .height('100%') 74 } 75} 76``` 77 78## 使用场景2 79 80自定义组件Index使用ForEach来进行不同\@Builder函数的渲染,可以使用builderArr声明的wrapBuilder数组进行不同\@Builder函数效果体现。整体代码会较整洁。 81 82``` 83@Builder 84function MyBuilder(value: string, size: number) { 85 Text(value) 86 .fontSize(size) 87} 88 89@Builder 90function YourBuilder(value: string, size: number) { 91 Text(value) 92 .fontSize(size) 93 .fontColor(Color.Pink) 94} 95 96const builderArr: WrappedBuilder<[string, number]>[] = [wrapBuilder(MyBuilder), wrapBuilder(YourBuilder)]; 97 98 99@Entry 100@Component 101struct Index { 102 @Builder testBuilder() { 103 ForEach(builderArr, (item: WrappedBuilder<[string, number]>) => { 104 item.builder('Hello World', 30) 105 } 106 107 ) 108 } 109 110 build() { 111 Row() { 112 Column() { 113 this.testBuilder() 114 } 115 .width('100%') 116 } 117 .height('100%') 118 } 119} 120``` 121 122 123 124## 错误场景 125 126``` 127function MyBuilder() { 128 129} 130 131// wrapBuilder必须传入被@Builder修饰的全局函数。 132const globalBuilder: WrappedBuilder<[string, number]> = wrapBuilder(MyBuilder); 133 134@Entry 135@Component 136struct Index { 137 @State message: string = 'Hello World'; 138 139 build() { 140 Row() { 141 Column() { 142 Text(this.message) 143 .fontSize(50) 144 .fontWeight(FontWeight.Bold) 145 globalBuilder.builder(this.message, 30) 146 } 147 .width('100%') 148 } 149 .height('100%') 150 } 151} 152``` 153 154