• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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