鸿蒙开发学习(一)之ArkTS
-
TypeScript語法
- 基礎
- module
-
ArkTS
-
基本UI描述
- 基本概念
-
狀態管理
-
頁面級變量的狀態管理
- @State
- @Prop
- @Link
- 應用級變量的狀態管理
-
頁面級變量的狀態管理
-
基本UI描述
-
開發入門
- 應用模型
- 目錄
-
UIAbility
- 生命周期
- 啟動模式
- 與UI的數據同步
TypeScript語法
基本語法
視頻教程
ArkTS是HarmonyOS優選的主力應用開發語言。ArkTS圍繞應用開發在TypeScript(簡稱TS,Microsoft)生態基礎上做了進一步擴展,繼承了TS的所有特性,是TS的超集。因此,在學習ArkTS語言之前,建議開發者具備TS語言開發能力。
基礎
let 、const、var
作用域:?var是函數作用域,這意味著如果你在函數內部使用?var?聲明一個變量,那么這個變量在整個函數內部都可以訪問。而?let?是塊級作用域,只能在聲明它的塊或子塊中訪問。
使用 let 可以減少由于編程錯誤或誤解引起的bug數量,并且強制執行更強大、更易理解、更可預測的編程模式。
TypeScript里使用 string表示文本數據類型, 可以使用雙引號( ")或單引號(')表示字符串。
let list: number[] = [1, 2, 3];
let list: Array<number> = [1, 2, 3];
//元組
let x: [string, number];
x = ['hello', 10]; // OK
x = [10, 'hello']; // Error
enum Color {Red, Green, Blue};
let c: Color = Color.Green;
let notSure: unknown = 4;
notSure = 'maybe a string instead';
notSure = false;
function test(): void {
console.log('This is function is void');
}
可選參數
function buildName(firstName: string, lastName?: string) {
if (lastName)
return firstName + ' ' + lastName;
else
return firstName;
}
let result1 = buildName('Bob');
let result2 = buildName('Bob', 'Adams');
箭頭函數
ES6版本的TypeScript提供了一個箭頭函數,它是定義匿名函數的簡寫語法,用于函數表達式,它省略了function關鍵字。箭頭函數的定義如下,其函數是一個語句塊:
( [param1, parma2,…param n] )=> {
// 代碼塊
}
其中,括號內是函數的入參,可以有0到多個參數,箭頭后是函數的代碼塊。我們可以將這個箭頭函數賦值給一個變量,如下所示:
let arrowFun = ( [param1, parma2,…param n] )=> {
// 代碼塊
}
類:和Java類似,有new、extends、this、public、private、protected
class Person {
private name: string
private age: number
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
public getPersonInfo(): string {
return `My name is ${this.name} and age is ${this.age}`;
}
}
for..of和for..in均可迭代一個列表,但是用于迭代的值卻不同:for..in迭代的是對象的鍵,而for..of則迭代的是對象的值。
let list = [4, 5, 6];
for (let i in list) {
console.log(i); // "0", "1", "2",
}
for (let i of list) {
console.log(i); // "4", "5", "6"
}
module
隨著應用越來越大,通常要將代碼拆分成多個文件,即所謂的模塊(module)
兩個模塊之間的關系是通過在文件級別上使用 import 和 export 建立的。模塊里面的變量、函數和類等在模塊外部是不可見的,除非明確地使用 export 導出它們。類似地,我們必須通過 import 導入其他模塊導出的變量、函數、類等。
export class NewsData {
title: string;
content: string;
imagesUrl: Array<NewsFile>;
source: string;
constructor(title: string, content: string, imagesUrl: Array<NewsFile>, source: string) {
this.title = title;
this.content = content;
this.imagesUrl = imagesUrl;
this.source = source;
}
}
import { NewsData } from '../common/bean/NewsData';
ArkTS
基本UI描述
- 裝飾器:用來裝飾類、結構體、方法以及變量,賦予其特殊的含義,如上述示例中 @Entry 、 @Component 、 @State 都是裝飾器。具體而言, @Component 表示這是個自定義組件; @Entry 則表示這是個入口組件; @State 表示組件中的狀態變量,這個狀態變化會引起 UI 變更。
- 自定義組件:可復用的 UI 單元,可組合其它組件,如上述被 @Component 裝飾的 struct Hello。
ArkTS通過裝飾器@Component和@Entry裝飾struct關鍵字聲明的數據結構,構成一個自定義組件。自定義組件中提供了一個build函數,開發者需在該函數內以鏈式調用的方式進行基本的UI描述,UI描述的方法請參考UI描述規范。
基本概念
- *struct:自定義組件可以基于struct實現,不能有繼承關系,對于struct的實例化,可以省略new。
- *裝飾器:裝飾器給被裝飾的對象賦予某一種能力,其不僅可以裝飾類或結構體,還可以裝飾類的屬性。多個裝飾器可以疊加到目標元素上,定義在同一行中或者分開多行,推薦分開多行定義。
@Entry
@Component
struct MyComponent {
}
- @Component:裝飾struct,結構體在裝飾后具有基于組件的能力,需要實現build方法來創建UI。
- @Entry: 裝飾struct,組件被裝飾后作為頁面的入口,頁面加載時將被渲染顯示
- @Preview:裝飾struct, 用@Preview裝飾的自定義組件可以在DevEco Studio的預覽器上進行實時預覽,加載頁面時,將創建并顯示@Preview裝飾的自定義組件。
狀態管理
基本概念-狀態管理-ArkTS語法(聲明式UI)-學習ArkTS語言-開發基礎知識-入門-HarmonyOS應用開發
ArkTS提供了多維度的狀態管理機制,在UI開發框架中,和UI相關聯的數據,不僅可以在組件內使用,還可以在不同組件層級間傳遞,比如父子組件之間、爺孫組件之間,也可以是全局范圍內的傳遞。另外,從數據的傳遞形式來看,可分為只讀的單向傳遞和可變更的雙向傳遞
頁面級變量的狀態管理
頁面級變量的狀態管理-狀態管理-ArkTS語法(聲明式UI)-學習ArkTS語言-開發基礎知識-入門-HarmonyOS應用開發
@State
@State裝飾的變量是組件內部的狀態數據,當這些狀態數據被修改時,將會調用所在組件的build方法進行UI刷新。
- 支持多種類型數據:支持class、number、boolean、string強類型數據的值類型和引用類型,不支持object和any。
- 內部私有:標記為@State的屬性是私有變量,只能在組件內訪問
- 需要本地初始化:必須為所有@State變量分配初始值
@Prop
@Prop與@State有相同的語義,但初始化方式不同。@Prop裝飾的變量必須使用其父組件提供的@State變量進行初始化,允許組件內部修改@Prop變量,但變量的更改不會通知給父組件,父組件變量的更改會同步到@prop裝飾的變量,即@Prop屬于單向數據綁定。
@Prop狀態數據具有以下特征:
- 支持簡單類型:僅支持number、string、boolean等簡單數據類型;
- 私有:僅支持組件內訪問;
- 支持多個實例:一個組件中可以定義多個標有@Prop的屬性;
- 創建自定義組件時將值傳遞給@Prop變量進行初始化:在創建組件的新實例時,必須初始化所有@Prop變量,不支持在組件內部進行初始化。
@Link
@Link裝飾的變量可以和父組件的@State變量建立雙向數據綁定,@Link變量不能在組件內部進行初始化。
應用級變量的狀態管理
應用級變量的狀態管理-狀態管理-ArkTS語法(聲明式UI)-學習ArkTS語言-開發基礎知識-入門-HarmonyOS應用開發
開發入門
應用模型
HarmonyOS先后提供了兩種應用模型:
- FA(Feature Ability)模型:?HarmonyOS API 7開始支持的模型,已經不再主推。FA模型開發可見FA模型開發概述。 [[FA模型]]
-
Stage模型:?HarmonyOS API 9開始新增的模型,是目前主推且會長期演進的模型。在該模型中,由于提供了AbilityStage、WindowStage等類作為應用組件和Window窗口的“舞臺”,因此稱這種應用模型為Stage模型。Stage模型開發可見Stage模型開發概述。
目錄
HAP 相當于Moudle,Entry相當于入口
- HAP(HarmonyOS Ability Package):這是一個包含應用程序代碼、資源文件和應用程序清單的文件。它被用作部署和安裝在鴻蒙設備上的應用程序。
- Entry類型的HAP:是應用的主模塊,在module.json5配置文件中的type標簽配置為“entry”類型。在同一個應用中,同一設備類型只支持一個Entry類型的HAP,通常用于實現應用的入口界面、入口圖標、主特性功能等。
- Ability:在鴻蒙系統中,Ability分為兩種類型,一種是Service Ability(服務能力),另一種是Page Ability(頁面能力)。前者主要處理后臺任務,如數據獲取等;后者則負責提供用戶界面并與用戶進行交互。
-
AppScope > app.json5:應用的全局配置信息。
-
entry:HarmonyOS工程模塊,編譯構建生成一個HAP包。
- src > main > ets:用于存放ArkTS源碼。
- src > main > ets > entryability:應用/服務的入口。
- src > main > ets > pages:應用/服務包含的頁面。
- src > main > resources:用于存放應用/服務所用到的資源文件,如圖形、多媒體、字符串、布局文件等。關于資源文件,詳見資源分類與訪問。
- src > main > module.json5:Stage模型模塊配置文件。主要包含HAP包的配置信息、應用/服務在具體設備上的配置信息以及應用/服務的全局配置信息。具體的配置文件說明,詳見module.json5配置文件。
- build-profile.json5:當前的模塊信息、編譯信息配置項,包括buildOption、targets配置等。其中targets中可配置當前運行環境,默認為HarmonyOS。
- hvigorfile.ts:模塊級編譯構建任務腳本,開發者可以自定義相關任務和代碼實現。
-
oh_modules:用于存放三方庫依賴信息。關于原npm工程適配ohpm操作,請參考歷史工程遷移。
-
build-profile.json5:應用級配置信息,包括簽名、產品配置等。
-
hvigorfile.ts:應用級編譯構建任務腳本。
開發者也可以在右鍵點擊“pages”文件夾時,選擇“New > Page”,則無需手動配置相關頁面路由。
UIAbility
UIAbility組件生命周期-UIAbility組件-Stage模型應用組件-Stage模型開發指導-應用模型-開發 | 華為開發者聯盟
UIAbility 相當于Android Activity,一個UIAbility組件中可以通過多個頁面來實現一個功能模塊。每一個UIAbility組件實例,都對應于一個最近任務列表中的任務。
在鴻蒙操作系統(HarmonyOS)中,UIAbility和Page是兩個不同的概念,它們都屬于應用程序的組成部分,但在功能和使用上有所區別。
- UIAbility:UIAbility是HarmonyOS中處理用戶界面相關任務的能力(Ability),它繼承自基礎類Ability。一個UIAbility可以包含多個Page。UIability主要負責頁面導航、數據傳遞以及生命周期管理等。
- Page:Page是構成UIAbility的基本單元,你可以將其理解為一種界面布局。一個頁面通常代表了一個完整的用戶界面,并且可以包含許多控件(Components)。每個Page都有自己獨立的生命周期,并且在需要時可以被創建、暫停或銷毀。
簡單來說,你可以把UIAbility看作是一本書,而每個Page就像書中的一頁。同時,這兩者共同工作以提供流暢且連貫的用戶體驗。
生命周期
WindowStageCreate和WindowStageDestroy狀態
UIAbility實例創建完成之后,在進入Foreground之前,系統會創建一個WindowStage。WindowStage創建完成后會進入onWindowStageCreate()回調,可以在該回調中設置UI界面加載、設置WindowStage的事件訂閱。
import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';
export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: Window.WindowStage) {
// 設置WindowStage的事件訂閱(獲焦/失焦、可見/不可見)
// 設置UI界面加載
windowStage.loadContent('pages/Index', (err, data) => {
// ...
});
}
}
啟動模式
singleton:單實例模式,也是默認情況下的啟動模式。在最近任務列表中只存在一個該類型的UIAbility實例。
standard:標準實例模式,每次調用startAbility()方法時,都會在應用進程中創建一個新的該類型UIAbility實例。即在最近任務列表中可以看到有多個該類型的UIAbility實例。
與UI的數據同步
UIAbility組件與UI的數據同步-UIAbility組件-Stage模型應用組件-Stage模型開發指導-應用模型-開發 | 華為開發者聯盟
基于HarmonyOS的應用模型,可以通過以下兩種方式來實現UIAbility組件與UI之間的數據同步。
- EventHub:基于發布訂閱模式來實現,事件需要先訂閱后發布,訂閱者收到消息后進行處理。
- globalThis:ArkTS引擎實例內部的一個全局對象,在ArkTS引擎實例內部都能訪問。
總結
以上是生活随笔為你收集整理的鸿蒙开发学习(一)之ArkTS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GitHub Universe 2023
- 下一篇: ChatGLM3-6B:新一代开源双语对