ArkTS基本语法详解

ArkTS基本语法详解: 

ArkTS页面布局 数据类型 条件判断 数组 ForEach循环遍历 List ListItem组件详解

官方文档 https://developer.harmonyos.com/cn/develop/arkts/

 

ArkTS HarmonyOS 优选的主力应用开发语言。 ArkTS 围绕应用开发在 TypeScript (简称 TS )生态基础上做了进一步扩展,继承了TS 的所有特性,是 TS 的超集。因此,在学习 ArkTS 语言之前,建议开发者具备TS 语言开发能力。

 

当前,ArkTSTS的基础上主要扩展了如下能力:

 

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

 

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

 

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

 

未来, ArkTS 会结合应用开发 / 运行的需求持续演进,逐步提供并行和并发能力增强、系统类型增强、分布式开发范式等更多特性。

 

 

 

一、ArkTS的基本组成 

 

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

 

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

 

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

 

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

 

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

 

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

 

系统组件、属性方法、事件方法具体使用可参考 基于 ArkTS 的声明式开发范式

 

二、ArkTS的布局结构 

布局的结构通常是分层级的,代表了用户界面中的整体架构。一个常见的页面结构如下所示 :  

 

为实现上述效果,开发者需要在页面中声明对应的元素。其中, Page 表示页面的根节点,
Column/Row 等元素为系统组件。针对不同的页面结构, ArkUI 提供了不同的布局组件来帮助开发者实现对应布局的效果,例如Row 用于实现线性布局等,后期课程我们会给大家详细讲解对应的布局。

 

三、ArkTS数据类型  

TypeScript 支持一些基础的数据类型,如布尔型、数组、字符串等

 

数字

 

TypeScript 里的所有数字都是浮点数,这些浮点数的类型是 number 。除了支持十进制,还支持二进制、八进制、十六进制。

 

 

字符串

 

TypeScript 里使用 string 表示文本数据类型, 可以使用双引号( " )或单引号( ' )表示字符串或者反引号(``` )。

 

反引号中可以配合 ${} 解析变量

 

 

布尔值

 

TypeScript 中可以使用 boolean 来表示这个变量是布尔值,可以赋值为 true 或者 false

 

 

联合类型

 

联合类型( Union Types )表示取值可以为多种类型中的一种。

 

如果一个数据可能有多重类型,或者当下还没想好用哪个类型 ...

 

let flag: string | number |boolean
flag = '1'
flag = 1
flag = true
数组

 

arkts 有两种方式可以定义数组。

 

第一种方式是使用数组泛型, Array< 元素类型 >

 

// 数组
let course1: Array<string> = ['flutter跨平台',"HarmonyOs",`golang`]

第二种,可以在元素类型后面接上 [],表示由此类型元素组成的一个数组。  

let course2: string[] = ['flutter',"HarmonyOs",`go语言`]

注意:字符串的几种表示方式  

 

枚举

 

enum 类型是对 JavaScript 标准数据类型的一个补充,使用枚举类型可以为一组数值赋予友好的名字。

 

enum Color {Red, Green, Blue};
let c: Color = Color.Green;
元组

 

元组类型允许表示一个 已知元素数量 类型 的数组,各元素的类型不必相同。 比如,你可以定义一对值分别为 string number 类型的元组。

 

let x: [string, number];
x = ['hello', 10]; // OK
x = [10, 'hello']; // Error

 

Void

 

当一个函数没有返回值时,你通常会见到其返回值类型是 void

 

function test(): void {
console.log('This is function is void');
}

 

Null Undefined

 

TypeScript 里, undefined null 两者各自有自己的类型分别叫做 undefined null

 

let u: undefined = undefined;
let n: null = null;

接口Interface类型  

interface UserInfoInterface{
username:string,
age:number,
sex:string
}
let userinfo:UserInfoInterface={
username:"张三",
age:20,
sex:"男"
}

完整代码  

//定义一个UserInterface的接口
interface UserInterface{
username:string
age:number
flag:boolean
}
@Entry
@Component
struct InterfacePage {
@State message: string = 'Hello World';
@State userinfo:UserInterface={
username:"张三",
age:20,
flag:true
}
build() {
Column() {
Text(this.message)
.fontSize(30)
.fontWeight(FontWeight.Bold)
Text(this.userinfo.username)
.fontSize(30)
.fontWeight(FontWeight.Bold)
.margin({top:20})
Text(`${this.userinfo.age}`)
.fontSize(30)
.fontWeight(FontWeight.Bold)
.margin({top:20})
}
.width('100%')
.height('100%')
}
}

 

ArkTS 数据类型应用

 

注意 :实际开发中尽量不要使用全局变量 , 组件中使用全局变量不需要加 this
//数字类型 (全局变量-组件中使用全局变量不需要加this)
//注意:实际开发中尽量不要使用全局变量
let num1: number = 123
let num2: number = 12.3
let num3: number = 0x1f
let num4: number = 0o12
let num5: number = 66
// 字符串类型 (全局变量-组件中使用全局变量不需要加this)
let str1: string = 'HarmonyOS Next不支持Android 应用了'
let str2: string = "ArkTS"
let str3: string = `马总今年${num5}岁了`
//布尔类型
let flag1: boolean = true;
let flag2: boolean = false;
//联合类型
let a: number | string | boolean
a = 12
a = "str"
a = true
// 枚举类型:使用枚举类型可以为一组数值赋予友好的名字
enum myColor {
RED = 'red',
BLUE = 'blue'
}
let content: myColor = myColor.RED
//代码格式化 :Ctrl+Alt+l
@Entry
@Component
struct Index {
@State message: string = "你好鸿蒙os"
@State str4: string = "HarmonyOS开发"
build() {
Column() {
Text("message")
.fontSize(50)
Divider()
Text(this.message)
.fontSize(50)
Divider()
Button('按钮').onClick(() => {
this.message = "HarmonyOs"
})
Divider()
Text(num2.toString())
.fontSize(40)
Text(`${num1}`)
.fontSize(40)
Divider()
Text(`注意:访问属性需要加this,this.str4=${this.str4}`)
.fontSize(30)
Divider()
Text(`${content}`)
.fontSize(30)
}.height('100%')
}
}

 

四、ArkTS渲染控制  

if/else :条件渲染

 

支持 if else else if 语句。

 

if else if 后跟随的条件语句可以使用状态变量。

 

允许在容器组件内使用,通过条件渲染语句构建不同的子组件。

 

if else if 后跟随的状态判断中使用的状态变量值变化时,条件渲染语句会进行更新

 

条件可以包括 Typescript 表达式

 

if(条件表达式){
组件内容1
}else{
组件内容2
}
ForEach :循环渲染

 

ForEach 接口基于数组类型数据来进行循环渲染,需要与容器组件配合使用,且接口返回的组件应当是允许包含在ForEach 父容器组件中的子组件。例如, ListItem 组件要求 ForEach 的父容器组件必须为 List组件。

 

ForEach(
arr: Array,
itemGenerator: (item: Array, index?: number) => void,
keyGenerator?: (item: Array, index?: number): string => string
)

注意:实际开发中尽量不要使用全局变量,组件中使用全局变量不需要加this  

//第一种方式是使用数组泛型,Array<元素类型>。
let arr1: Array<string> = ["Harmonyos next", 'Go', "flutter"]
//第二种,可以在元素类型后面接上 [],表示由此类型元素组成的一个数组。
let arr2: string[] = ["Harmonyos Next", 'Go', "flutter", "Harmonyos4"]
//元组类型:元组类型允许表示一个已知元素数量和类型的数组
let x: [string, number, boolean]
x = ["张三", 20, false]
let c: [string, number, boolean] = ["张三", 20, false]
//定义一个UserInterface的接口
interface UserInfoInterface {
username: string
age: number
}
@Entry
@Component
struct ArrayPage {
@State message: string = 'Hello World';
@State flag: boolean = true;
@State arr3: number[] = [12, 13, 45, 56]
@State arr4: UserInfoInterface[] = [
{
username: "zhangsan",
age: 20,
},
{
username: "李四",
age: 21,
},
{
username: "王五",
age: 22,
}
]
build() {
Column() {
if (this.flag) {
Text(this.message)
.fontSize(40)
.fontWeight(FontWeight.Bold)
}
ForEach(this.arr3, (item: number) => {
Text(`${item}`)
.fontSize(24)
.fontWeight(FontWeight.Bold)
.textAlign(TextAlign.Center)
})
List({
space: 10
}) {
ForEach(this.arr4, (item: UserInfoInterface) => {
ListItem() {
Text(`${item.username}---${item.age}`)
.fontSize(24)
.width("100%")
.backgroundColor("#eee")
.textAlign(TextAlign.Center)
}
})
}.margin({
top: 20
})
//Ctrl+Alt+l
Button({ type: ButtonType.Normal }) {
Text("点击我").fontColor(Color.White)
}
.margin({
top: 20
})
.width("80%")
.height(50)
.borderRadius(10)
.onClick(() => {
this.flag = !this.flag
})
}
.width('100%')
.height('100%')
}
}

List ListItem组件的使用 

@Entry
@Component
struct ListPage {
@State message: string = 'Hello World'
build() {
Column(){
List({space:10}){ //Ctrl+点鼠标左键 看源代码
ListItem(){
Text("鸿蒙os")
.fontSize(24)
.width('100%')
.height(60)
.textAlign(TextAlign.Center) //Ctrl+鼠标左键
.backgroundColor("#eee")
.borderRadius(20)
}
ListItem(){
Text("鸿蒙os")
.fontSize(24)
.width('100%')
.height(60)
.textAlign(TextAlign.Center) //Ctrl+鼠标左键
.backgroundColor("#eee")
.borderRadius(20)
}
ListItem(){
Text("鸿蒙os")
.fontSize(24)
.width('100%')
.height(60)
.textAlign(TextAlign.Center) //Ctrl+鼠标左键
.backgroundColor("#eee")
.borderRadius(20)
}
}
}.height('100%')
.width('100%')
.padding(10)
}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值