鸿蒙开发笔记(一):ArkTS概述及声明式UI的使用

ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。

ArkTS在TS的基础上主要扩展了如下能力:

  • 基本语法:ArkTS定义了声明式UI描述、自定义组件和动态扩展UI元素的能力,再配合ArkUI开发框架中的系统组件及其相关的事件方法、属性方法等共同构成了UI开发的主体。

  • 状态管理:ArkTS提供了多维度的状态管理机制。在UI开发框架中,与UI相关联的数据可以在组件内使用,也可以在不同组件层级间传递,比如父子组件之间、爷孙组件之间,还可以在应用全局范围内传递或跨设备传递。另外,从数据的传递形式来看,可分为只读的单向传递和可变更的双向传递。开发者可以灵活的利用这些能力来实现数据和UI的联动。

  • 渲染控制:ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态,渲染对应状态下的UI内容。循环渲染可从数据源中迭代获取数据,并在每次迭代过程中创建相应的组件。数据懒加载从数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。

1. 基本语法

1.1 概述

ArkTS的基本组成如下所示:

  • 装饰器 : 用于装饰类、结构、方法以及变量,并赋予其特殊的含义。如上述示例中@Entry、@Component和@State都是装饰器,@Component表示自定义组件,@Entry表示该自定义组件为入口组件,@State表示组件中的状态变量,状态变量变化会触发UI刷新。

    相当于Java开发中的注解

  • UI描述:以声明式的方式来描述UI的结构,例如build()方法中的代码块。

  • 自定义组件:可复用的UI单元,可组合其他组件,如上述被@Component装饰的struct Hello。

  • 系统组件:ArkUI框架中默认内置的基础和容器组件,可直接被开发者调用,比如示例中的Column、Text、Divider、Button。

  • 属性方法:组件可以通过链式调用配置多项属性,如fontSize()、width()、height()、backgroundColor()等。

  • 事件方法:组件可以通过链式调用设置多个事件的响应逻辑,如跟随在Button后面的onClick()。

除此之外,ArkTS扩展了多种语法范式来使开发更加便捷:

  • @Builder/@BuilderParam:特殊的封装UI描述的方法,细粒度的封装和复用UI描述。
  • @Extend/@Style:扩展内置组件和封装属性样式,更灵活地组合内置组件。
  • stateStyles:多态样式,可以依据组件的内部状态的不同,设置不同样式。

1.2 声明式UI描述

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

根据组件构造方法的不同,创建组件包含有参数和无参数两种方式。创建组件时不需要new运算符。

1. 无参数

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

javascript 复制代码
Column() {
  Text('item 1')
  Divider()
  Text('item 2')
}
2. 有参数

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

Image组件的必选参数src。

javascript 复制代码
Image('https://xyz/test.jpg')

Text组件的非必选参数content。

javascript 复制代码
// string类型的参数
Text('test')
// $r形式引入应用资源,可应用于多语言场景
Text($r('app.string.title_value'))
// 无参数形式
Text()

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

javascript 复制代码
Image(this.imagePath)
Image('https://' + this.imageUrl)
Text(`count: ${this.count}`)
3. 配置属性

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

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

javascript 复制代码
Text('hello')
  .fontSize(this.size)
Image('test.jpg')
  .width(this.count % 2 === 0 ? 100 : 200)    
  .height(this.offset + 100)

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

javascript 复制代码
Text('hello')
  .fontSize(20)
  .fontColor(Color.Red)
  .fontWeight(FontWeight.Bold)
4. 配置事件

事件方法以"."链式调用的方式配置系统组件支持的事件,建议每个事件方法单独写一行。

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

javascript 复制代码
Button('Click me')
  .onClick(() => {
    this.myText = 'ArkUI';
  })

使用匿名函数表达式配置组件的事件方法,要求使用bind,以确保函数体中的this指向当前组件。

javascript 复制代码
Button('add counter')
  .onClick(function(){
    this.counter += 2;
  }.bind(this))

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

javascript 复制代码
myClickHandler(): void {
  this.counter += 2;
}
...
Button('add counter')
  .onClick(this.myClickHandler.bind(this))
5. 配置子组件

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

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

javascript 复制代码
Column() {
  Text('Hello')
    .fontSize(100)
  Divider()
  Text(this.myText)
    .fontSize(100)
    .fontColor(Color.Red)
}

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

javascript 复制代码
Column() {
  Row() {
    Image('test1.jpg')
      .width(100)
      .height(100)
    Button('click +1')
      .onClick(() => {
        console.info('+1 clicked!');
      })
  }
}
相关推荐
敦普水性工业漆1 分钟前
敦普水漆无铬锌铝涂层:守护汽车4000颗紧固件的防锈方案
经验分享·笔记·汽车
Sally璐璐1 小时前
HarmonyOS开发利器:ArkTS全解析
华为·harmonyos
LXL_242 小时前
超子说物联网-MQTT_笔记1---通过EMQX搭建MQTT服务器
服务器·笔记·物联网
૮・ﻌ・3 小时前
前端HTML学习笔记
前端·笔记·html·黑马程序员
移动端开发者4 小时前
鸿蒙Next显示动画animateTo介绍
harmonyos
移动端开发者4 小时前
鸿蒙Next使用AudioCapturer实现音频录制和AI语言转文字
harmonyos
永生辉皇4 小时前
JS红宝书笔记 8.3 继承
开发语言·javascript·笔记
移动端开发者4 小时前
鸿蒙Next选择按钮Toggle、Checkbox、Radio介绍
harmonyos
永生辉皇4 小时前
JS红宝书笔记 8.2 创建对象
javascript·笔记·原型模式
R.X. NLOS4 小时前
论文阅读笔记 | Qwen-VL:一个视觉语言大模型,通晓理解、定位、文本阅读等多种能力
论文阅读·笔记·大模型·多模态大模型·qwen-vl