
ArkTS基本语法详解
ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。因此,在学习ArkTS语言之前,建议开发者具备TS语言开发能力。
·
ArkTS基本语法详解:
ArkTS页面布局 数据类型 条件判断 数组 ForEach循环遍历 List ListItem组件详解
官方文档 : https://developer.harmonyos.com/cn/develop/arkts/
ArkTS 是 HarmonyOS 优选的主力应用开发语言。 ArkTS 围绕应用开发在 TypeScript (简称 TS )生态基础上做了进一步扩展,继承了TS 的所有特性,是 TS 的超集。因此,在学习 ArkTS 语言之前,建议开发者具备TS 语言开发能力。
当前,ArkTS在TS的基础上主要扩展了如下能力:
基本语法 : 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)
}
}
更多推荐
所有评论(0)