• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# HML语法参考
2
3
4HML(OpenHarmony Markup Language)是一套类HTML的标记语言,通过组件,事件构建出页面的内容。页面具备数据绑定、事件绑定、条件渲染和逻辑控制等高级能力。
5
6
7## 页面结构
8
9
10```html
11<!-- xxx.hml -->
12<div class="item-container">
13  <text class="item-title">Image Show</text>
14  <div class="item-content">
15    <image src="/common/xxx.png" class="image"></image>
16  </div>
17</div>
18```
19
20
21## 数据绑定
22
23
24```html
25<!-- xxx.hml -->
26<div class="item-container">
27  <text>{{content}} </text>            <!-- 输出:Hello World!-->
28  <text>{{key1}} {{key2}}</text>       <!-- 输出:Hello World6+-->
29  <text>key1 {{key1}}</text>           <!-- 输出:key1 Hello 6+-->
30  <text>{{flag1 && flag2}}</text>      <!-- 输出:false 6+-->
31  <text>{{flag1 || flag2}}</text>      <!-- 输出:true 6+-->
32  <text>{{!flag1}}</text>              <!-- 输出:false 6+-->
33</div>
34```
35
36
37```json
38{
39  "data": {
40    "content": "Hello World!",
41    "key1": "Hello",
42    "key2": "World",
43    "flag1": true,
44    "flag2": false
45  }
46}
47```
48
49
50>  **说明:**
51>  - key值支持对象操作符和数组操作符,如{{key.value}}、{{key[0]}}。
52>
53>  - 从 API Version 6 开始支持字符串拼接、逻辑运算和三元表达式。
54>   - 字符串拼接:
55>      - 支持变量跟变量:{{key1}}{{key2}}等
56>      - 支持常量跟变量: "my name is {{name}}, i am from {{city}}."    "key1 {{key1}}"
57>   - 逻辑运算:
58>      - 与:{{flag1 &amp;&amp; flag2}}(仅支持两个boolean变量间的与)
59>      - 或:{{flag1 || flag2}} (仅支持两个boolean变量间的或)
60>      - 非:{{!flag1}} (仅支持boolean变量的非运行)
61>   - 三元表达式
62>      - {{flag? key1:key2}}(flag为boolean变量,key1和key2可以是变量,也可以是常量)
63>   - 注意事项
64>      - 非boolean类型值进行bool运算默认为false
65>      - 以上所有变量解析跟运算解析均不支持嵌套
66
67## 事件绑定
68
69卡片仅支持click通用事件,事件的定义只能是直接命令式,事件定义必须包含action字段,用以说明事件类型。卡片支持两种事件类型:跳转事件(router)和消息事件(message)。跳转事件可以跳转到卡片提供方的OpenHarmony应用,消息事件可以将开发者自定义信息传递给卡片提供方。事件参数支持变量,变量以"{{}}"修饰。跳转事件中若定义了params字段,则在被拉起应用的onStart的intent中,可用"params"作为key将跳转事件定义的params字段的值取到。
70
71- 跳转事件格式
72
73  通过定义ability名称和携带的参数字段params直接跳转,可用"params"作为key提取到跳转事件定义的params字段值。
74
75  | 选择器         | 样例     | 默认值      | 样例描述                                     |
76  | ----------- | ------ | -------- | ---------------------------------------- |
77  | action      | string | "router" | 事件类型。<br/>- "router":用于应用跳转。<br/>- "message":自定义点击事件。 |
78  | abilityName | string | -        | 跳转ability名。                              |
79  | params      | Object | -        | 跳转应用携带的额外参数。                             |
80
81
82  ```json
83  // xxx.json
84  {
85    "data": {
86      "mainAbility": "xxx.xxx.xxx"
87    },
88    "actions": {
89      "routerEvent": {
90        "action": "router",
91        "abilityName": "{{mainAbility}}",
92        "params":{}
93      }
94    }
95  }
96  ```
97
98- 消息事件格式
99
100  | 选择器    | 样例     | 默认值     | 样例描述         |
101  | ------ | ------ | ------- | ------------ |
102  | action | string | message | 表示事件类型。      |
103  | params | Object | -       | 跳转应用携带的额外参数。 |
104
105
106  ```json
107  // xxx.json
108  {
109    "actions": {
110      "activeEvent": {
111        "action": "message",
112        "params": {}
113      }
114    }
115  }
116  ```
117
118- 绑定路由事件和消息事件
119
120  ```html
121  <!-- xxx.hml -->
122  <div>
123    <!-- 正常格式 -->
124    <div onclick="activeEvent"></div>
125    <!-- 缩写 -->
126    <div @click="activeEvent"></div>
127  </div>
128  ```
129
130
131## 列表渲染
132
133
134```html
135<!-- xxx.hml -->
136<div class="array-container">
137  <!-- div列表渲染 -->
138  <!-- 默认$item代表数组中的元素, $idx代表数组中的元素索引 -->
139  <div for="{{array}}" tid="id">
140    <text>{{$item.name}}</text>
141  </div>
142  <!-- 自定义元素变量名称 -->
143  <div for="{{value in array}}" tid="id">
144    <text>{{value.name}}</text>
145  </div>
146  <!-- 自定义元素变量、索引名称 -->
147  <div for="{{(index, value) in array}}" tid="id">
148    <text>{{value.name}}</text>
149  </div>
150</div>
151```
152
153
154```json
155// xxx.json
156{
157  "data": {
158    "array": [
159      {"id": 1, "name": "jack", "age": 18},
160      {"id": 2, "name": "tony", "age": 18}
161    ]
162  }
163}
164```
165
166tid属性主要用来加速for循环的重渲染,旨在列表中的数据有变更时,提高重新渲染的效率。tid属性是用来指定数组中每个元素的唯一标识,如果未指定,数组中每个元素的索引为该元素的唯一id。例如上述tid="id"表示数组中的每个元素的id属性为该元素的唯一标识。for循环支持的写法如下:
167
168- for="array":其中array为数组对象,array的元素变量默认为$item。
169
170- for="v in array":其中v为自定义的元素变量,元素索引默认为$idx。
171
172- for="(i, v) in array":其中元素索引为i,元素变量为v,遍历数组对象array。
173
174>  **说明:**
175>  - 数组中的每个元素必须存在tid指定的数据属性,否则运行时可能会导致异常。
176>
177>  - 数组中被tid指定的属性要保证唯一性,如果不是则会造成性能损耗。比如,示例中只有id和name可以作为tid字段,因为它们属于唯一字段。
178>
179>  - tid不支持表达式。
180>
181>  - 不支持for嵌套使用。
182>
183>  - for对应的变量数组,当前要求数组中的object是相同类型,不支持多种object类型混合写在一个数组中。
184
185
186## 条件渲染
187
188条件渲染分为2种:if/elif/else和show。
189
190当使用if/elif/else写法时,节点必须是兄弟节点,否则编译无法通过。实例如下:
191
192
193```html
194<!-- xxx.hml -->
195<div>
196  <text if="{{show}}"> Hello-TV </text>
197  <text elif="{{display}}"> Hello-Wearable </text>
198  <text else> Hello-World </text>
199</div>
200```
201
202
203```json
204// xxx.json
205{
206  "data": {
207    "show": false,
208    "display": true
209  }
210}
211```
212
213当show为真时,节点正常渲染;当show为假时,节点不渲染,效果等同display样式为none。
214
215
216```html
217<!-- xxx.hml -->
218<text show="{{visible}}"> Hello World </text>
219```
220
221
222```json
223// xxx.json
224{
225  "data": {
226    "visible": false
227  }
228}
229```
230
231
232## 逻辑控制块
233
234&lt;block&gt;控制块使得循环渲染和条件渲染变得更加灵活;block在构建时不会被当作真实的节点编译。block标签只支持if属性。
235
236
237```html
238<!-- xxx.hml -->
239<div>
240  <block if="{{show}}">
241    <text>Hello</text>
242    <text>World</text>
243  </block>
244</div>
245```
246
247
248```json
249// xxx.json
250{
251  "data": {
252    "show": true
253  }
254}
255```
256