HarmonyOS 基礎語法概述 UI范式

ArkUI框架 - 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擴展了多種語法范式來使開發更加便捷:

  • @Builder/@BuilderParam:特殊的封裝UI描述的方法,細粒度的封裝和復用UI描述。

  • @Extend/@Styles:擴展內置組件和封裝屬性樣式,更靈活地組合內置組件。

  • stateStyles:多態樣式,可以依據組件的內部狀態的不同,設置不同樣式。

創建自定義組件

自定義組件具有以下特點:

  • 可組合:允許開發者組合使用系統組件、及其屬性和方法。
  • 可重用:自定義組件 可以被其他組件重用,并作為不同的實例在不同的父組件或容器中使用。
  • 數據驅動UI更新:通過狀態變量的改變,來驅動UI的刷新。

自定義組件的基本用法


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

注意
如果在另外的文件中引用該自定義組件,需要使用export關鍵字導出,并在使用的頁面import該自定義組件。

HelloComponent可以在其他自定義組件中的build()函數中多次創建,實現自定義組件的重用。



struct ParentComponent {build() {Column() {Text('ArkUI message')HelloComponent({ message: 'Hello World!' });Divider()HelloComponent({ message: '你好,世界!' });}}
}

頁面和自定義組件生命周期

自定義組件和頁面的關系:

  • 自定義組件:@Component裝飾的UI單元,可以組合多個系統組件實現UI的復用,可以調用組件的生命周期。
  • 頁面:即應用的UI頁面。可以由一個或者多個自定義組件組成,@Entry裝飾的自定義組件為頁面的入口組件,即頁面的根節點,一個頁面有且僅能有一個@Entry。只有被@Entry裝飾的組件才可以調用頁面的生命周期。

頁面生命周期,即被@Entry裝飾的組件生命周期,提供以下生命周期接口:

  • onPageShow:頁面每次顯示時觸發一次,包括路由過程、應用進入前臺等場景。
  • onPageHide:頁面每次隱藏時觸發一次,包括路由過程、應用進入后臺等場景。
  • onBackPress:當用戶點擊返回按鈕時觸發。

組件生命周期,即一般用@Component裝飾的自定義組件的生命周期,提供以下生命周期接口:

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

  • onDidBuild:組件build()函數執行完成之后回調該接口,開發者可以在這個階段進行埋點數據上報等不影響實際UI的功能。不建議在onDidBuild函數中更改狀態變量、使用animateTo等功能,這可能會導致不穩定的UI表現。

  • aboutToDisappear:aboutToDisappear函數在自定義組件析構銷毀之前執行。不允許在aboutToDisappear函數中改變狀態變量,特別是@Link變量的修改可能會導致應用程序行為不穩定。

生命周期流程如下圖所示,下圖展示的是被@Entry裝飾的組件(頁面)生命周期。
被@Entry裝飾的組件(頁面)生命周期

循環渲染

ForEach接口基于數組類型數據來進行循環渲染,需要與容器組件配合使用

鍵值生成規則

在ForEach循環渲染過程中,系統會為每個數組元素生成一個唯一且持久的鍵值,用于標識對應的組件。當這個鍵值變化時,ArkUI框架將視為該數組元素已被替換或修改,并會基于新的鍵值創建一個新的組件。

ForEach提供了一個名為keyGenerator的參數,這是一個函數,開發者可以通過它自定義鍵值的生成規則。如果開發者沒有定義keyGenerator函數,則ArkUI框架會使用默認的鍵值生成函數,即(item: Object, index: number) => { return index + ‘__’ + JSON.stringify(item); }。

ArkUI框架對于ForEach的鍵值生成有一套特定的判斷規則,這主要與itemGenerator函數的第二個參數index以及keyGenerator函數的第二個參數index有關,具體的鍵值生成規則判斷邏輯如下圖所示。
ForEach鍵值生成規則

正確渲染并保證效率的ForEach寫法是:

ForEach(this.simpleList, (item: string) => {ChildItem({ item: item })
}, (item: string) => item.id)  // 需要保證key唯一

示例:在文章列表卡片上點擊“點贊”按鈕,從而修改文章的點贊數量。
Article類被@Observed裝飾器修飾。父組件ArticleListView傳入Article對象實例給子組件ArticleCard,子組件使用@ObjectLink裝飾器接收該實例。

當點擊第1個文章卡片上的點贊圖標時,會觸發ArticleCard組件的handleLiked函數。
該函數修改第1個卡片對應組件里article實例的isLiked和likesCount屬性值。
article實例是@ObjectLink裝飾的狀態變量,它的屬性值變化,觸發對應的ArticleCard組件渲染,讀取到的isLiked和likesCount為修改后的新值。


class Article {id: string;title: string;brief: string;isLiked: boolean;likesCount: number;constructor(id: string, title: string, brief: string, isLiked: boolean, likesCount: number) {this.id = id;this.title = title;this.brief = brief;this.isLiked = isLiked;this.likesCount = likesCount;}
}

struct ArticleListView { articleList: Array<Article> = [new Article('001', '第0篇文章', '文章簡介內容', false, 100),new Article('002', '第1篇文章', '文章簡介內容', false, 100),new Article('003', '第2篇文章', '文章簡介內容', false, 100),new Article('004', '第4篇文章', '文章簡介內容', false, 100),new Article('005', '第5篇文章', '文章簡介內容', false, 100),new Article('006', '第6篇文章', '文章簡介內容', false, 100),];build() {List() {ForEach(this.articleList, (item: Article) => {ListItem() {ArticleCard({article: item}).margin({ top: 20 })}}, (item: Article) => item.id)}.padding(20).scrollBar(BarState.Off).backgroundColor(0xF1F3F5)}
}
struct ArticleCard { article: Article;handleLiked() {this.article.isLiked = !this.article.isLiked;this.article.likesCount = this.article.isLiked ? this.article.likesCount + 1 : this.article.likesCount - 1;}build() {Row() {// 此處'app.media.icon'僅作示例,請開發者自行替換,否則imageSource創建失敗會導致后續無法正常執行。Image($r('app.media.icon')).width(80).height(80).margin({ right: 20 })Column() {Text(this.article.title).fontSize(20).margin({ bottom: 8 })Text(this.article.brief).fontSize(16).fontColor(Color.Gray).margin({ bottom: 8 })Row() {// 此處app.media.iconLiked','app.media.iconUnLiked'僅作示例,請開發者自行替換,否則imageSource創建失敗會導致后續無法正常執行。Image(this.article.isLiked ? $r('app.media.iconLiked') : $r('app.media.iconUnLiked')).width(24).height(24).margin({ right: 8 })Text(this.article.likesCount.toString()).fontSize(16)}.onClick(() => this.handleLiked()).justifyContent(FlexAlign.Center)}.alignItems(HorizontalAlign.Start).width('80%').height('100%')}.padding(20).borderRadius(12).backgroundColor('#FFECECEC').height(120).width('100%').justifyContent(FlexAlign.SpaceBetween)}
}

上述代碼的初始運行效果(左圖)和點擊第1個文章卡片上的點贊圖標后的運行效果(右圖)如下圖所示。
數組項子屬性變化案例運行效果圖

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

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

相關文章

Docker鏡像基本概念與構建指南

Docker鏡像基本概念與構建指南 一、Docker鏡像基本概念 Docker鏡像是容器運行的基礎&#xff0c;包含應用程序及其運行所需的文件系統、依賴庫、環境變量和配置。其核心特性包括&#xff1a; 只讀性&#xff1a;鏡像本身不可修改&#xff0c;容器運行時在鏡像層之上創建可寫…

如何避免 CDN 緩存泄漏用戶隱私數據

CDN 通過將內容緩存到全球各地的邊緣服務器上,顯著縮短了數據傳輸的物理距離,從而加速了內容的交付。然而,這一技術在提升性能的同時,也悄然埋下了一顆隱私隱患的種子——緩存數據可能被不當訪問或泄漏,進而暴露用戶的敏感信息。 目錄 禁用對用戶個人信息的緩存 僅緩存…

軟考中級數據庫系統工程師學習資料分享

軟考中級數據庫系統工程師考試對于很多 IT 從業者和計算機專業的大學生來說&#xff0c;是一個重要的職業資格認證。它不僅能夠提升個人的專業技能&#xff0c;還能為職業發展增添有力的砝碼。今天&#xff0c;我將為大家分享一套全面且實用的學習資料&#xff0c;幫助大家更好…

數據處理: 均值漂移聚類(Mean Shift)

一、 基本原理 Mean Shift是一種基于密度的非參數聚類算法&#xff0c;不需要預先指定簇的數量&#xff0c;而是通過尋找數據空間中密度最大的區域來自動確定聚類中心, 適合圖像分割和目標跟蹤等。 算法步驟 初始化&#xff1a;對每個數據點作為起點。 迭代&#xff1a;計算…

辛格迪客戶案例 | 蘇州富士萊醫藥GMP培訓管理(TMS)項目

一、案例概述 富士萊醫藥股份有限公司位于美麗的江南水鄉常熟&#xff0c;前身為常熟富士萊醫藥化工有限公司&#xff0c;從建廠初期面積僅有10余畝&#xff0c;逐步擴展到100余畝。近年來公司飛速發展&#xff0c;以黑馬姿態發展成為中國專業生產硫辛酸系列產品、肌肽系列產品…

SQL注入相關知識

一、布爾盲注 1、布爾盲簡介 布爾盲注是一種SQL注入攻擊技術&#xff0c;用于在無法直接獲取數據庫查詢結果的情況下&#xff0c;通過頁面的響應來判斷注入語句的真假&#xff0c;從而獲取數據庫中的敏感信息 2、布爾盲注工作原理 布爾盲注的核心在于利用SQL語句的布爾邏輯…

Linux基礎學習--linux的文件權限與目錄配置

linux的文件權限與目錄配置 1.用戶與用戶組 在Linux中&#xff0c;每個文件都有相當多的屬性和權限&#xff0c;其中最重要的概念就是文件的擁有者。 1.1 文件擁有者 Linux是一個多人多任務的系統&#xff0c;常常有多人共用一臺主機的情況出現&#xff0c;因此在系統中可以…

【數據可視化-19】智能手機用戶行為可視化分析

?? 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN人工智能領域的優質創作者,提供AI相關的技術咨詢、項目開發和個…

vue項目通過GetCapabilities獲取wmts服務元數據信息并在openlayers進行疊加顯示

vue項目通過openlayers加載wmts服務示例&#xff1a; <template><div id"map" ref"mapContainer"></div> </template><script> import ol/ol.css; import Map from ol/Map; import View from ol/View; import TileLayer fr…

JavaWeb學習打卡-Day1-分層解耦、Spring IOC、DI

三層架構 Controller&#xff08;控制層&#xff09;&#xff1a;接收前端發送的請求&#xff0c;對請求進行處理&#xff0c;并響應數據。Service&#xff08;業務邏輯層&#xff09;&#xff1a;處理具體的業務邏輯。DAO&#xff08;數據訪問層/持久層&#xff09;&#xff…

【含文檔+PPT+源碼】基于Python爬蟲二手房價格預測與可視化系統的設計與實現

項目介紹 本課程演示的是一款基于Python爬蟲二手房價格預測與可視化系統&#xff0c;主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 包含&#xff1a;項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 帶你從零開始部署運行本套系統 該項…

游戲引擎學習第229天

倉庫:https://gitee.com/mrxiao_com/2d_game_5 回顧上次內容并介紹今天的主題 上次留下的是一個非常簡單的任務&#xff0c;至少第一步是非常簡單的。我們需要在渲染器中加入排序功能&#xff0c;這樣我們的精靈&#xff08;sprites&#xff09;才能以正確的順序顯示。為此我…

【“星瑞” O6 評測】—NPU 部署 face parser 模型

前言 瑞莎星睿 O6 (Radxa Orion O6) 擁有高達 28.8TOPs NPU (Neural Processing Unit) 算力&#xff0c;支持 INT4 / INT8 / INT16 / FP16 / BF16 和 TF32 類型的加速。這里通過通過官方的工具鏈進行FaceParsingBiSeNet的部署 1. FaceParsingBiSeNet onnx 推理 首先從百度網盤…

單例模式的使用場景 以及 餓漢式寫法(智能指針)

單例模式的使用場景 以及 餓漢式寫法&#xff08;智能指針&#xff09; 餓漢式&#xff1a;創建類時就已經創建好了類的實例&#xff08;用智能指針實現&#xff09;什么時候用單例模式&#xff1a;1. 全局配置管理2. 日志系統3. 資源管理器4. 硬件設備訪問總結 餓漢式&#xf…

微信小程序的全局變量(quanjubianliang)

在微信小程序開發中&#xff0c;管理和使用全局變量是一種常見的需求。例如&#xff0c;可以通過小程序的App實例和globalData對象來實現全局變量的存儲和共享。以下是詳細說明&#xff1a; 1. 全局變量的定義 微信小程序提供了 App() 函數&#xff0c;其中可以定義一個 global…

Latex科研入門教程

Introduction 這篇文章適合有markdown基礎的人看,不會的人可以先去學一下markdown. 僅適用于科研入門. 本文使用的latex環境為overleaf Latex概況 文件格式 以.tex為結尾的文件可能有多個.tex文件最終只編譯一個文件,相當于一個文件控制其他子文件. Latex 代碼分為三種&…

FastGPT Docker Compose本地部署與硅基流動免費AI接口集成指南

本文參考&#xff1a;https://doc.tryfastgpt.ai/docs/development/ 一、背景與技術優勢 FastGPT是基于LLM的知識庫問答系統&#xff0c;支持自定義數據訓練與多模型接入。硅基流動&#xff08;SiliconFlow&#xff09;作為AI基礎設施平臺&#xff0c;提供高性能大模型推理引…

19_大模型微調和訓練之-基于LLamaFactory+LoRA微調LLama3

基于LLamaFactory微調_LLama3的LoRA微調 1. 基本概念1.1. LoRA微調的基本原理1.2. LoRA與QLoRA1.3. 什么是 GGUF 2.LLaMA-Factory介紹3. 實操3.1 實驗環境3.2 基座模型3.3 安裝 LLaMA-Factory 框架3.3.1 前置條件 3.4 數據準備3.5 微調和訓練模型torch.cuda.OutOfMemoryError: …

Linux Wlan-四次握手(eapol)框架流程

協議基礎 基于 IEEE 802.1X 標準實現的協議 抓包基礎 使用上一章文章的TPLINK wn722n v1網卡在2.4G 頻段抓包&#xff08;v2、v3是不支持混雜模式的&#xff09; eapol的四個交互流程 根據不同的認證模式不同&#xff0c;兩者的Auth流程有所不同&#xff0c;但是握手流程基…

基于亞馬遜云科技 Amazon Bedrock Tool Use 實現 Generative UI

背景 在當前 AI 應用開發浪潮中&#xff0c;越來越多的開發者專注于構建基于大語言模型&#xff08;LLM&#xff09;的 chatbot 和 AI Agent。然而&#xff0c;傳統的純文本對話形式存在局限性&#xff0c;無法為用戶提供足夠直觀和豐富的交互體驗。為了增強用戶體驗&#xff…