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