#HarmonyOS:基礎語法

基礎語法

  1. 定義了聲明式UI描述;

  2. 自定義組件;

  3. 動態擴展UI元素的能力;

狀態管理

  1. 多維度裝填管理機制;
  2. 父子組件間
  3. 爺孫組件間
  4. 全局范圍內傳遞
  5. 跨設備傳遞
  6. 只讀的單向傳遞
  7. 可變的雙向傳遞

渲染控制

  • UI描述:以聲明式的方式來描述UI的結構,例如build()方法中的代碼塊;
  • 自定義組件:可復用的UI單元,可組合其他組件,如上述被@Component裝飾的struct Hello。、
  • 系統組件:ArkUI框架中默認內置的基礎和容器組件。

自定義組件

  1. 可組合

  2. 可重用

  3. 數據驅動UI更新

    自定義組件的基本結構

    @Component
    struct HelloComponent {@State message: string = 'Hello, World!';build() {// HelloComponent自定義組件組合系統組件Row和TextRow() {Text(this.message).onClick(() => {// 狀態變量message的改變驅動UI刷新,UI從'Hello, World!'刷新為'Hello, ArkUI!'this.message = 'Hello, ArkUI!';})}}
    }
    

    struct+自定義組件名+{…}

    @Component裝飾器僅能裝飾struct關鍵字聲明的數據結構。

    struct被@Component裝飾后具備組件化的能力,需要實現build方法描述UI。

    @Component
    struct MyComponent {build() {}
    }
    
成員函數/變量

成員函數具有以下約束:

  • 不支持靜態函數。
  • 成員函數的訪問始終是私有的。

成員變量具有以下約束:

  • 不支持靜態成員變量。
  • 所有成員變量都是私有的,變量的訪問規則與成員函數的訪問規則相同。
  • 自定義組件的成員變量本地初始化有些是可選的,有些是必選的。具體是否需要本地初始化,是否需要從父組件通過參數傳遞初始化子組件的成員變量,請參考狀態管理。
自定義組件的參數規定
@Component
struct MyComponent {private countDownFrom: number = 0;private color: Color = Color.Blue;build() {}
}@Entry
@Component
struct ParentComponent {private someColor: Color = Color.Pink;build() {Column() {// 創建MyComponent實例,并將創建MyComponent成員變量countDownFrom初始化為10,將成員變量color初始化為this.someColorMyComponent({ countDownFrom: 10, color: this.someColor })}}
}
build()函數

所有聲明在build()函數的語言,我們統稱為UI描述語言。

UI描述需要遵循以下規則:

@Entry裝飾的自定義組件,其build()函數下的根節點唯一且必要,且必須為容器組件,其中ForEach禁止作為根節點。

@Component裝飾的自定義組件,其build()函數下的根節點唯一且必要,可以為非容器組件,其中ForEach禁止作為根節點。

@Entry
@Component
struct MyComponent {build() {// 根節點唯一且必要,必須為容器組件Row() {ChildComponent() }}
}@Component
struct ChildComponent {build() {// 根節點唯一且必要,可為非容器組件Image('test.jpg')}
}
反例
build() {// 反例:不允許聲明本地變量let a: number = 1;
}
build() {// 反例:不允許聲明本地變量let a: number = 1;
}

不允許創建本地的作用域,反例如下

build() {// 反例:不允許本地作用域{...}
}

不允許調用除了被@Builder裝飾以外的方法,允許系統組件的參數是TS方法的返回值

@Component
struct ParentComponent {doSomeCalculations() {}calcTextValue(): string {return 'Hello World';}@Builder doSomeRender() {Text(`Hello World`)}build() {Column() {// 反例:不能調用沒有用@Builder裝飾的方法this.doSomeCalculations();// 正例:可以調用this.doSomeRender();// 正例:參數可以為調用TS方法的返回值Text(this.calcTextValue())}}
}

不允許switch語法,如果需要使用條件判斷,請使用if。反例如下。

build() {Column() {// 反例:不允許使用switch語法switch (expression) {case 1:Text('...')break;case 2:Image('...')break;default:Text('...')break;}}
}

不允許使用表達式,反例如下。

build() {Column() {// 反例:不允許使用表達式(this.aVar > 10) ? Text('...') : Image('...')}
}
自定義組件通用樣式

自定義組件通過“.”鏈式調用的形式設置通用樣式。

@Component
struct MyComponent2 {build() {Button(`Hello World`)}
}@Entry
@Component
struct MyComponent {build() {Row() {MyComponent2().width(200).height(300).backgroundColor(Color.Red)}}
}

ArkUI給自定義組件設置樣式時,相當于給MyComponent2套了一個不可見的容器組件,而這些樣式是設置在容器組件上的,而非直接設置給MyComponent2的Button組件。通過渲染結果我們可以很清楚的看到,背景顏色紅色并沒有直接生效在Button上,而是生效在Button所處的開發者不可見的容器組件上。

頁面和自定義組件聲明周期

頁面

即應用的UI頁面。可以由一個或者多個自定義組件組成,

@Entry裝飾的自定義組件為頁面的入口組件,即頁面的根節點,一個頁面有且僅有一個@Entry

只有被@Entry裝飾的組件才可以調用頁面的聲明周期

  • onPageShow:頁面每次顯示時觸發。

  • onPageHide:頁面每次隱藏時觸發一次。

  • onBackPress:當用戶點擊返回按鈕時觸發。

  • aboutToAppear:組件即將出現時回調該接口,具體時機為在創建自定義組件的新實例后,在執行其build()函數之前執行。

  • aboutToDisappear:在自定義組件即將析構銷毀時執行。

// Index.ets
import router from '@ohos.router';@Entry
@Component
struct MyComponent {@State showChild: boolean = true;// 只有被@Entry裝飾的組件才可以調用頁面的生命周期onPageShow() {console.info('Index onPageShow');}// 只有被@Entry裝飾的組件才可以調用頁面的生命周期onPageHide() {console.info('Index onPageHide');}// 只有被@Entry裝飾的組件才可以調用頁面的生命周期onBackPress() {console.info('Index onBackPress');}// 組件生命周期aboutToAppear() {console.info('MyComponent aboutToAppear');}// 組件生命周期aboutToDisappear() {console.info('MyComponent aboutToDisappear');}build() {Column() {// this.showChild為true,創建Child子組件,執行Child aboutToAppearif (this.showChild) {Child()}// this.showChild為false,刪除Child子組件,執行Child aboutToDisappearButton('create or delete Child').onClick(() => {this.showChild = false;})// push到Page2頁面,執行onPageHideButton('push to next page').onClick(() => {router.pushUrl({ url: 'pages/Page2' });})}}
}@Component
struct Child {@State title: string = 'Hello World';// 組件生命周期aboutToDisappear() {console.info('[lifeCycle] Child aboutToDisappear')}// 組件生命周期aboutToAppear() {console.info('[lifeCycle] Child aboutToAppear')}build() {Text(this.title).fontSize(50).onClick(() => {this.title = 'Hello ArkUI';})}
}

@Builder裝飾器:自定義構建函數

@Builder所裝飾的函數遵循build()函數語法規則,開發者額可以將重復使用的UI元素抽象成一個方法,在build方法里調用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208675.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208675.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208675.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鴻蒙方舟開發框架ArkUI簡介

語雀知識庫地址:語雀HarmonyOS知識庫 飛書知識庫地址:飛書HarmonyOS知識庫 嗨,各位別來無恙吶,我是小白 眾所周知,華為在今年推出了 HarmonyOS 4.0 版本,而在此之前的版本中,HarmonyOS 應用的 …

2024年AI視頻識別技術的6大發展趨勢預測

隨著人工智能技術的快速發展,AI視頻識別技術也將會得到進一步的發展和應用。2023年已經進入尾聲,2024年即將來臨,那么AI視頻識別技術又將迎來怎樣的發展趨勢?本文將對2023年的AI視頻技術做一個簡單的盤點并對2024年的發展趨勢進行…

Advanced Renamer

Advanced Renamer 安裝鏈接 1.前后添加字符 2.字符轉數字,編號整體加減

oracle實驗2023-12-8--觸發器

第十四周實驗 【例】功能要求:增加一新表XS_1,表結構和表XS相同,用來存放從XS表中刪除的記錄。 分析: 1、創建表 xs_1 SQL> create table xs_1 as select * from xs; Table created SQL> truncate table xs_1; Table truncated題目&a…

StoneDB-8.0-V2.2.0 企業版正式發布!性能優化,穩定性提升,持續公測中!

? 11月,StoneDB 新版本如期而至,這一個月來我們的研發同學加班加點,持續迭代:在 2.2.0 版本中,我們針對用戶提出的需求和做出了重量級更新,修復了一些已知和用戶反饋的 Bug,同時對部分代碼進行…

PairLIE論文閱讀筆記

PairLIE論文閱讀筆記 論文為2023CVPR的Learning a Simple Low-light Image Enhancer from Paired Low-light Instances.論文鏈接如下: openaccess.thecvf.com/content/CVPR2023/papers/Fu_Learning_a_Simple_Low-Light_Image_Enhancer_From_Paired_Low-Light_Instan…

Kafka安全性探究:構建可信賴的分布式消息系統

在本文中,將研究Kafka的安全性,探討如何確保數據在傳輸和存儲過程中的完整性、機密性以及授權訪問。通過詳實的示例代碼,全面討論Kafka安全性的各個方面,從加密通信到訪問控制,幫助大家構建一個可信賴的分布式消息系統…

vue3 setup router的使用教程

vue3 setup router的使用教程 文章目錄 vue3 setup router的使用教程1. 安裝2. 使用(創建路由實例)3. 路由跳轉3.1 通過router-link標簽跳轉3.2 通過js代碼跳轉 4. 接收參數4.1 通過query接收參數4.2 通過params接收參數 5. 路由守衛5.1 全局守衛5.2 路由…

阿里云docker加速

文章目錄 一、 阿里云鏡像倉庫配置二、配置加速1. CentOS2. Mac3. Windows注意 一、 阿里云鏡像倉庫配置 1.注冊阿里云賬號,并登陸到阿里云后臺,進入控制臺面板 2.進入控制臺以后,找到左上方的三橫的功能列表按鈕,在彈出來的功能…

智能手機IC

智能手機IC 電子元器件百科 文章目錄 智能手機IC前言一、智能手機IC是什么二、智能手機IC的類別三、智能手機IC應用實例四、智能手機IC作用總結前言 智能手機IC通過相互配合和協同工作,支持智能手機的各種功能和特性,如高速計算、多媒體處理、無線通信、圖形渲染、傳感器數據…

G1 GC基本邏輯

1 MixedGC基本過程 在G1GC中,有兩種主要的垃圾回收過程:Young GC和Mixed GC。這兩者都是為了回收堆內存中的垃圾對象,但是他們關注的區域和工作方式有所不同。 Young GC: Young GC主要負責回收Young Generation(包括…

跟著GPT學設計模式之建造者模式

Builder 模式,中文翻譯為建造者模式或者構建者模式,也有人叫它生成器模式。允許你創建不同口味的對象同時避免構造器污染。當一個對象可能有幾種口味,或者一個對象的創建涉及到很多步驟時會很有用。 現實世界例子:想象一個角色扮…

Vue:用IDEA開發Vue,標簽語法爆紅問題處理

一、場景描述 我在IDEA中,學習Vue課程。 入門學習時,是在html文件中,script引入vue.js文件方式。 此時,在html文件中用v-標簽,爆紅。 二、解決辦法 打開 菜單欄 File - Settings 選擇 Editor - Files Type&#xf…

《每天一個Linux命令》 -- (5)通過sshkey密鑰登錄服務器

歡迎閱讀《每天一個Linux命令》系列!在本篇文章中,將介紹通過密鑰生成,使用公鑰連接管理服務器。 概念 SSH 密鑰是用于安全地訪問遠程服務器的一種方法。SSH 密鑰由一對密鑰組成:公鑰和私鑰。公鑰存儲在遠程服務器上,…

軟件工程復習

一、題型 單項選擇題 20分 填空題 10分 判斷題 10分 簡答題 18分 應用題 12分 綜合題 30分 軟件程序數據文檔 軟件是無形的、不可見的邏輯實體 20世紀60年代末爆發軟件危機 軟件危機是指軟件在開發與維護過程中遇到的一系列嚴重的問題 …

理解 GET、POST、PATCH 和 DELETE 請求的參數傳遞方式

理解 GET、POST、PATCH 和 DELETE 請求的參數傳遞方式 本文將向您介紹在使用 GET、POST、PATCH 和 DELETE 請求時如何傳遞參數。通過詳細解釋每種請求的參數傳遞方式和示例代碼,您將了解如何正確地將數據發送到服務器并與之交互。 GET 請求的參數傳遞方式 在 GET…

CentOS 7.9安裝寶塔面板,安裝gitlab服務器

docker安裝方式比較慢,安裝包1.3GB 安裝后啟動很慢 docker logs q18qgztxdvozdv_gitlab-ce-gitlab-1 docker ps docker exec -it q18qgztxdvozdv_gitlab-ce-gitlab-1 sh cd /etc/gitlab cat initial_root_password 軟件商店安裝方式,失敗了2023.12…

clickhouse刪除partition分區數據

clickhouse分布式表tencent_table_20231208_DIST,本地表tencent_table_20231208_local; 30臺clickhouse存儲服務器; 本地表:tencent_table_20231208_local CREATE TABLE tencent_sz.tencent_table_20231208_local (id Int64 DEFA…

hook其他調試技巧

輸出堆棧信息 通過 android.util.Log 輸出當前線程的堆棧跟蹤信息。 function showStacks() {Java.perform(function () {console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new() )); }) } 可以在需要的…

機器學習--稀疏學習

前置知識: 通常學習一次模型的過程如下:我們普遍為了獲取更好的模型效果,直接對原始數據學習,會造成過擬合、需要特征提取; 而若特征提取完后依舊有很多特征,還是會容易過擬合。這時候就需要特征降維和特…