arkts-declarative-ui-description.md 3.7 KB
Newer Older
Z
zengyawen 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
# 声明式UI描述


ArkTS以声明方式组合和扩展组件来描述应用程序的UI,同时还提供了基本的属性、事件和子组件配置方法,帮助开发者实现应用交互逻辑。


## 创建组件

根据组件构造方法的不同,创建组件包含有参数和无参数两种方式。

>  **说明:**
>
>  创建组件时不需要new运算符。


### 无参数

如果组件的接口定义没有包含必选构造参数,则组件后面的“()”不需要配置任何内容。例如,Divider组件不包含构造参数:


```ts
Column() {
  Text('item 1')
  Divider()
  Text('item 2')
}
```


### 有参数

如果组件的接口定义包含构造参数,则在组件后面的“()”配置相应参数。

- Image组件的必选参数src。

  ```ts
  Image('https://xyz/test.jpg')
  ```


- Text组件的非必选参数content。

H
HelloCrease 已提交
43
  ```ts
Z
zengyawen 已提交
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
  // string类型的参数
  Text('test')
  // $r形式引入应用资源,可应用于多语言场景
  Text($r('app.string.title_value'))
  // 无参数形式
  Text()
  ```


- 变量或表达式也可以用于参数赋值,其中表达式返回的结果类型必须满足参数类型要求。
    例如,设置变量或表达式来构造Image和Text组件的参数。

    ```ts
    Image(this.imagePath)
    Image('https://' + this.imageUrl)
    Text(`count: ${this.count}`)
    ```


## 配置属性

属性方法以“.”链式调用的方式配置系统组件的样式和其他属性,建议每个属性方法单独写一行。


- 配置Text组件的字体大小。

  ```ts
  Text('test')
    .fontSize(12)
  ```

- 配置组件的多个属性。

  ```ts
  Image('test.jpg')
    .alt('error.jpg')    
    .width(100)    
    .height(100)
  ```

- 除了直接传递常量参数外,还可以传递变量或表达式。

  ```ts
  Text('hello')
    .fontSize(this.size)
  Image('test.jpg')
    .width(this.count % 2 === 0 ? 100 : 200)    
    .height(this.offset + 100)
  ```

- 对于系统组件,ArkUI还为其属性预定义了一些枚举类型供开发者调用,枚举类型可以作为参数传递,但必须满足参数类型要求。
  例如,可以按以下方式配置Text组件的颜色和字体样式。

  ```ts
  Text('hello')
    .fontSize(20)
    .fontColor(Color.Red)
    .fontWeight(FontWeight.Bold)
  ```


## 配置事件

Y
yamila 已提交
107
事件方法以“.”链式调用的方式配置系统组件支持的事件,建议每个事件方法单独写一行。
Z
zengyawen 已提交
108 109 110 111 112 113 114 115 116 117 118


- 使用lambda表达式配置组件的事件方法。

  ```ts
  Button('Click me')
    .onClick(() => {
      this.myText = 'ArkUI';
    })
  ```

119
- 使用匿名函数表达式配置组件的事件方法,要求使用“() => {...}”,以确保函数与组件绑定,同时符合ArtTS语法规范。
Z
zengyawen 已提交
120 121 122

  ```ts
  Button('add counter')
123
    .onClick(() => {
Z
zengyawen 已提交
124
      this.counter += 2;
125
    })
Z
zengyawen 已提交
126 127 128 129 130 131 132 133 134 135
  ```

- 使用组件的成员函数配置组件的事件方法。

  ```ts
  myClickHandler(): void {
    this.counter += 2;
  }
  ...
  Button('add counter')
136
    .onClick(this.myClickHandler)
Z
zengyawen 已提交
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
  ```


## 配置子组件

如果组件支持子组件配置,则需在尾随闭包"{...}"中为组件添加子组件的UI描述。Column、Row、Stack、Grid、List等组件都是容器组件。


- 以下是简单的Column组件配置子组件的示例。

  ```ts
  Column() {
    Text('Hello')
      .fontSize(100)
    Divider()
    Text(this.myText)
      .fontSize(100)
      .fontColor(Color.Red)
  }
  ```

- 容器组件均支持子组件配置,可以实现相对复杂的多级嵌套。

  ```ts
  Column() {
    Row() {
      Image('test1.jpg')
        .width(100)
        .height(100)
      Button('click +1')
        .onClick(() => {
          console.info('+1 clicked!');
        })
    }
  }
  ```