1# 声明式UI描述 2 3 4ArkTS以声明方式组合和扩展组件来描述应用程序的UI,同时还提供了基本的属性、事件和子组件配置方法,帮助开发者实现应用交互逻辑。 5 6 7## 创建组件 8 9根据组件构造方法的不同,创建组件包含有参数和无参数两种方式。 10 11> **说明:** 12> 13> 创建组件时不需要new运算符。 14 15 16### 无参数 17 18如果组件的接口定义没有包含必选构造参数,则组件后面的“()”不需要配置任何内容。例如,Divider组件不包含构造参数: 19 20 21```ts 22Column() { 23 Text('item 1') 24 Divider() 25 Text('item 2') 26} 27``` 28 29 30### 有参数 31 32如果组件的接口定义包含构造参数,则在组件后面的“()”配置相应参数。 33 34- Image组件的必选参数src。 35 36 ```ts 37 Image('https://xyz/test.jpg') 38 ``` 39 40 41- Text组件的非必选参数content。 42 43 ```ts 44 // string类型的参数 45 Text('test') 46 // $r形式引入应用资源,可应用于多语言场景 47 Text($r('app.string.title_value')) 48 // 无参数形式 49 Text() 50 ``` 51 52 53- 变量或表达式也可以用于参数赋值,其中表达式返回的结果类型必须满足参数类型要求。 54 例如,设置变量或表达式来构造Image和Text组件的参数。 55 56 ```ts 57 Image(this.imagePath) 58 Image('https://' + this.imageUrl) 59 Text(`count: ${this.count}`) 60 ``` 61 62 63## 配置属性 64 65属性方法以“.”链式调用的方式配置系统组件的样式和其他属性,建议每个属性方法单独写一行。 66 67 68- 配置Text组件的字体大小。 69 70 ```ts 71 Text('test') 72 .fontSize(12) 73 ``` 74 75- 配置组件的多个属性。 76 77 ```ts 78 Image('test.jpg') 79 .alt('error.jpg') 80 .width(100) 81 .height(100) 82 ``` 83 84- 除了直接传递常量参数外,还可以传递变量或表达式。 85 86 ```ts 87 Text('hello') 88 .fontSize(this.size) 89 Image('test.jpg') 90 .width(this.count % 2 === 0 ? 100 : 200) 91 .height(this.offset + 100) 92 ``` 93 94- 对于系统组件,ArkUI还为其属性预定义了一些枚举类型供开发者调用,枚举类型可以作为参数传递,但必须满足参数类型要求。 95 例如,可以按以下方式配置Text组件的颜色和字体样式。 96 97 ```ts 98 Text('hello') 99 .fontSize(20) 100 .fontColor(Color.Red) 101 .fontWeight(FontWeight.Bold) 102 ``` 103 104 105## 配置事件 106 107事件方法以“.”链式调用的方式配置系统组件支持的事件,建议每个事件方法单独写一行。 108 109 110- 使用lambda表达式配置组件的事件方法。 111 112 ```ts 113 Button('Click me') 114 .onClick(() => { 115 this.myText = 'ArkUI'; 116 }) 117 ``` 118 119- 使用匿名函数表达式配置组件的事件方法,要求使用bind,以确保函数体中的this指向当前组件。 120 121 ```ts 122 Button('add counter') 123 .onClick(function(){ 124 this.counter += 2; 125 }.bind(this)) 126 ``` 127 128- 使用组件的成员函数配置组件的事件方法。 129 130 ```ts 131 myClickHandler(): void { 132 this.counter += 2; 133 } 134 ... 135 Button('add counter') 136 .onClick(this.myClickHandler.bind(this)) 137 ``` 138 139 140## 配置子组件 141 142如果组件支持子组件配置,则需在尾随闭包"{...}"中为组件添加子组件的UI描述。Column、Row、Stack、Grid、List等组件都是容器组件。 143 144 145- 以下是简单的Column组件配置子组件的示例。 146 147 ```ts 148 Column() { 149 Text('Hello') 150 .fontSize(100) 151 Divider() 152 Text(this.myText) 153 .fontSize(100) 154 .fontColor(Color.Red) 155 } 156 ``` 157 158- 容器组件均支持子组件配置,可以实现相对复杂的多级嵌套。 159 160 ```ts 161 Column() { 162 Row() { 163 Image('test1.jpg') 164 .width(100) 165 .height(100) 166 Button('click +1') 167 .onClick(() => { 168 console.info('+1 clicked!'); 169 }) 170 } 171 } 172 ``` 173