1# \@Extend:定义扩展组件样式 2 3 4在前文的示例中,可以使用\@Styles用于样式的扩展,在\@Styles的基础上,我们提供了\@Extend,用于扩展原生组件样式。 5 6 7> **说明:** 8> 从API version 9开始,该装饰器支持在ArkTS卡片中使用。 9 10 11## 装饰器使用说明 12 13 14### 语法 15 16 17```ts 18@Extend(UIComponentName) function functionName { ... } 19``` 20 21 22### 使用规则 23 24- 和\@Styles不同,\@Extend仅支持定义在全局,不支持在组件内部定义。 25 26- 和\@Styles不同,\@Extend支持封装指定的组件的私有属性和私有事件和预定义相同组件的\@Extend的方法。 27 28 ```ts 29 // @Extend(Text)可以支持Text的私有属性fontColor 30 @Extend(Text) function fancy () { 31 .fontColor(Color.Red) 32 } 33 // superFancyText可以调用预定义的fancy 34 @Extend(Text) function superFancyText(size:number) { 35 .fontSize(size) 36 .fancy() 37 } 38 ``` 39 40 41- 和\@Styles不同,\@Extend装饰的方法支持参数,开发者可以在调用时传递参数,调用遵循TS方法传值调用。 42 43 ```ts 44 // xxx.ets 45 @Extend(Text) function fancy (fontSize: number) { 46 .fontColor(Color.Red) 47 .fontSize(fontSize) 48 } 49 50 @Entry 51 @Component 52 struct FancyUse { 53 build() { 54 Row({ space: 10 }) { 55 Text('Fancy') 56 .fancy(16) 57 Text('Fancy') 58 .fancy(24) 59 } 60 } 61 } 62 ``` 63 64- \@Extend装饰的方法的参数可以为function,作为Event事件的句柄。 65 66 ```ts 67 @Extend(Text) function makeMeClick(onClick: () => void) { 68 .backgroundColor(Color.Blue) 69 .onClick(onClick) 70 } 71 72 @Entry 73 @Component 74 struct FancyUse { 75 @State label: string = 'Hello World'; 76 77 onClickHandler() { 78 this.label = 'Hello ArkUI'; 79 } 80 81 build() { 82 Row({ space: 10 }) { 83 Text(`${this.label}`) 84 .makeMeClick(this.onClickHandler.bind(this)) 85 } 86 } 87 } 88 ``` 89 90- \@Extend的参数可以为[状态变量](arkts-state-management-overview.md),当状态变量改变时,UI可以正常的被刷新渲染。 91 92 ```ts 93 @Extend(Text) function fancy (fontSize: number) { 94 .fontColor(Color.Red) 95 .fontSize(fontSize) 96 } 97 98 @Entry 99 @Component 100 struct FancyUse { 101 @State fontSizeValue: number = 20 102 build() { 103 Row({ space: 10 }) { 104 Text('Fancy') 105 .fancy(this.fontSizeValue) 106 .onClick(() => { 107 this.fontSizeValue = 30 108 }) 109 } 110 } 111 } 112 ``` 113 114 115## 使用场景 116 117以下示例声明了3个Text组件,每个Text组件均设置了fontStyle、fontWeight和backgroundColor样式。 118 119 120```ts 121@Entry 122@Component 123struct FancyUse { 124 @State label: string = 'Hello World' 125 126 build() { 127 Row({ space: 10 }) { 128 Text(`${this.label}`) 129 .fontStyle(FontStyle.Italic) 130 .fontWeight(100) 131 .backgroundColor(Color.Blue) 132 Text(`${this.label}`) 133 .fontStyle(FontStyle.Italic) 134 .fontWeight(200) 135 .backgroundColor(Color.Pink) 136 Text(`${this.label}`) 137 .fontStyle(FontStyle.Italic) 138 .fontWeight(300) 139 .backgroundColor(Color.Orange) 140 }.margin('20%') 141 } 142} 143``` 144 145\@Extend将样式组合复用,示例如下。 146 147 148```ts 149@Extend(Text) function fancyText(weightValue: number, color: Color) { 150 .fontStyle(FontStyle.Italic) 151 .fontWeight(weightValue) 152 .backgroundColor(color) 153} 154``` 155 156通过\@Extend组合样式后,使得代码更加简洁,增强可读性。 157 158 159```ts 160@Entry 161@Component 162struct FancyUse { 163 @State label: string = 'Hello World' 164 165 build() { 166 Row({ space: 10 }) { 167 Text(`${this.label}`) 168 .fancyText(100, Color.Blue) 169 Text(`${this.label}`) 170 .fancyText(200, Color.Pink) 171 Text(`${this.label}`) 172 .fancyText(200, Color.Orange) 173 }.margin('20%') 174 } 175} 176``` 177