问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

ArkTS基本语法详解:从基础组成到数据类型和渲染控制

创作时间:
作者:
@小白创作中心

ArkTS基本语法详解:从基础组成到数据类型和渲染控制

引用
CSDN
1.
https://blog.csdn.net/yuanlaile/article/details/142755844

ArkTS是HarmonyOS的首选应用开发语言,它在TypeScript的基础上进行了扩展,提供了声明式UI描述、状态管理和渲染控制等能力。本文将详细介绍ArkTS的基本语法,包括基本组成、布局结构、数据类型和渲染控制等内容。

ArkTS的基本组成

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

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

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

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

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

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

ArkTS的布局结构

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

其中,Page表示页面的根节点,Column/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;

元组

元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。

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:"男"
}

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)
}
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号