1. 背景

在鸿蒙开发中,ArkTS是优选的主力应用开发语言。

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

因此,在学习ArkTS语言之前,建议开发者具备TS语言开发能力,本文的假设前提为,读者拥有TS编程经验。

2. 综述

学习UI开发,一般关注以下三个问题:

1)界面和控件如何编写;

2)状态管理和组件间的数据传递如何实现;

3)用户交互时,如何做到界面渲染控制。

在展开讲界面和控件编写前,本文先介绍两个UI相关的核心概念:装饰器、UI描述。

3. 装饰器

在鸿蒙开发中,关键的UI相关的定义(界面入口、自定义组件、状态变量、样式定义等)都是通过装饰器来标注。

常用的装饰器例如:@Entry、@Component、@State、@Builder、@Extend、@Styles等。

  • @Component表示自定义组件;
  • @Entry表示该自定义组件为入口组件;
  • @State表示组件中的状态变量,状态变量变化会触发UI刷新;
  • @Builder/@BuilderParam:特殊的封装UI描述的方法,细粒度的封装和复用UI描述;
  • @Extend/@Styles:扩展内置组件和封装属性样式,更灵活地组合内置组件;

下面是一个Hello World程序中的拆解示意图:

其中:@Component表示Hello是一个自定义组件;@Entry表示当前自定义组件为UI页面的入口(单个UI页面中,最多可以使用@Entry装饰一个自定义组件);@State表示myText是一个内部状态变量(任何对myText的修改,都将触发UI的刷新);

4. UI描述

鸿蒙UI的开发在build()函数中完成,整个build()函数的开发类似于编写描述文件,我们也将buid()开发过程称为UI描述

分析下图中的Hello World程序,它做了以下几件UI描述的事儿:

  1. 创建了一个Column()垂直布局组件,组件内部配置了三个子组件;
  2. 在垂直布局控件中,创建了一个Text()文本组件;
  3. 紧接着接了一个Diveder()水平分割线组件;
  4. 紧接着创建了一个Button按钮,并且配置属性:高度为50,宽度为100,顶部间距为20;
  5. Button配置了事件监听器,将myText的值从“Hello World”改为了 “ArkUI”。

交互示意图如下:

从示意图中,我们可以总结出UI 描述的几个关键点:a)创建组件;b)给组件配置属性;c)给组件配置事件监听;d)给组件添加子组件。

我们分别来了解下:

4.1 创建组件

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

  • 有参数

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

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

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

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

  • 无参数

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

Column() {  Text('item 1')  Divider() // 无参数示例  Text('item 2')}

4.2 配置属性

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

// 配置Button属性Button()  .height(50)  .width(100)  .margin({top: 20})
// 配置Text属性Text('Hello World') .fontSize(50)

4.3 配置事件

配置事件与配置属性类似

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

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

tips:这里推荐使用箭头函数来作为事件的执行回调函数。如果使用 function 匿名函数,或者使用组件成员变量,需要bind(this)保证传入的回调函数与当前组件一致
// case1: 匿名function,需要bind(this)
Button('add counter')
.onClick(function(){
this.counter += 2;
}.bind(this)) // case2: 成员函数,需要.bind(this)
myClickHandler(): void {
this.counter += 2;
}
...
Button('add counter')
.onClick(this.myClickHandler.bind(this))

4.4 配置子组件

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

Column() {
// 下面的代码是Column组件d的子组件
Text('Hello')
.fontSize(100)
Divider()
Text(this.myText)
.fontSize(100)
.fontColor(Color.Red) }

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

Column() {
// 下面的代码是Column组件d的子组件
Row() {
// 下面的代码是Row组件d的子组件(Row嵌套在了Column中)
Image('test1.jpg')
.width(100)
.height(100)
Button('click +1')
.onClick(() => {
console.info('+1 clicked!');
})
}
}

鸿蒙UI开发快速入门 —— part01: 装饰器&UI描述的更多相关文章

  1. WPF开发快速入门【7】WPF的拖放功能(Drag and Drop)

    概述 本文描述WPF的拖放功能(Drag and Drop). 拖放功能涉及到两个功能,一个就是拖,一个是放.拖放可以发生在两个控件之间,也可以在一个控件自己内部拖放.假设界面上有两个控件,一个Tre ...

  2. Apple Watch开发快速入门教程

     Apple Watch开发快速入门教程  试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...

  3. Python入门篇-装饰器

    Python入门篇-装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.装饰器概述 装饰器(无参) 它是一个函数 函数作为它的形参 返回值也是一个函数 可以使用@functi ...

  4. Transform组件C#游戏开发快速入门

    Transform组件C#游戏开发快速入门大学霸 组件(Component)可以看作是一类属性的总称.而属性是指游戏对象上一切可设置.调节的选项,如图2-8所示.本文选自C#游戏开发快速入门大学霸   ...

  5. HealthKit开发快速入门教程之HealthKit数据的操作

    HealthKit开发快速入门教程之HealthKit数据的操作 数据的表示 在HealthKit中,数据是最核心的元素.通过分析数据,人们可以看到相关的健康信息.例如,通过统计步数数据,人们可以知道 ...

  6. HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID

    HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...

  7. HealthKit开发快速入门教程之HealthKit开发概述简介

    HealthKit开发快速入门教程之HealthKit开发概述简介 2014年6月2日召开的年度开发者大会上,苹果发布了一款新的移动应用平台,可以收集和分析用户的健康数据.该移动应用平台被命名为“He ...

  8. 游戏控制杆OUYA游戏开发快速入门教程

    游戏控制杆OUYA游戏开发快速入门教程 1.2.2  游戏控制杆 游戏控制杆各个角度的视图,如图1-4所示,它的硬件规格是本文选自OUYA游戏开发快速入门教程大学霸: 图1-4  游戏控制杆各个角度的 ...

  9. SpringBoot开发快速入门

    SpringBoot开发快速入门 目录 一.Spring Boot 入门 1.Spring Boot 简介 2.微服务 3.环境准备 1.maven设置: 2.IDEA设置 4.Spring Boot ...

  10. python进阶04 装饰器、描述器、常用内置装饰器

    python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...

随机推荐

  1. 邀请你参与字节跳动 UME 插件开发竞赛

    UME 是由字节跳动 Flutter Infra 团队出品和维护的 Flutter 应用内调试工具.通过在 Flutter 应用中加入 UME 工具,开发者们可以直接在应用内查看调试信息,而无需使用 ...

  2. LinerProgression

    手动实现线性回归 点击查看代码 import torch import pandas as pd import numpy as np import matplotlib.pyplot as plt ...

  3. Kubernetes基础(基本概念、架构)(十)

    一.介绍 Kubernetes(简称 K8S) 的出现是容器化技术发展的必然结果,容器化是应用程序级别的虚拟化,运行单个内核上有多个独立的用户空间实例,这些实例就是容器:容器提供了将应用程序的代码.运 ...

  4. .NET 8.0 酒店管理系统设计与实现

    前言 给大家推荐一个基于.NET 8.0 的中小型酒店设计的管理系统. 随着酒店的日常工作增加,很难用人工去进行处理一些繁琐的数据,也可能会因为人工的失误而造成酒店的损失,因此需要一款可以协助酒店进行 ...

  5. js中,什么是数组 , 数组有几种创建方式?

    1. 什么是数组? 数组是可以把一组相关的数据一起存放,并提供方便的访问(存取) 数组是指一组数据的集合,其中每个数据被称作元素(数组单元),数组单元可以是任意类型的数据,数组是一种将一组数据存储在单 ...

  6. vant2 自动检查表单验证 -validate

    ref 给 <van-form @submit="onSubmit" ref="form"> 标签 : // 检验手机号是否合格 await thi ...

  7. 04-react的基本:条件渲染

    import reactDom from "react-dom" // 条件渲染 if else let loading = false // 写一个函数用于加载 const lo ...

  8. docker打包镜像,上传镜像仓库,使用rancher发布

    步骤一.首先将项目打包放在指定目录下 项目jar包名称为  micro-app.jar 步骤二.将jar包名称改为指定名称,执行命令    docker build -t micro-gateway: ...

  9. 【VMware VCF】更新 VCF 5.1 至 VCF 5.2 版本。

    VMware Cloud Foundation(VCF)是一个由众多产品(vSphere.vSAN 以及 NSX 等)所构成的 SDDC 解决方案,这些环境中的不同组件的生命周期统一由 SDDC Ma ...

  10. 《使用Gin框架构建分布式应用》阅读笔记:p77-p87

    <用Gin框架构建分布式应用>学习第5天,p77-p87总结,总计11页. 一.技术总结 1.Go知识点 (1)context 2.on-premises software p80, A ...