01. HarmonyOS應用開發實踐與技術解析

文章目錄

    • 前言
    • 項目概述
    • HarmonyOS應用架構
      • 項目結構
      • Ability生命周期
    • ArkTS語言特性
      • 裝飾器
      • 狀態管理
    • UI組件與布局
      • 基礎組件
      • 響應式布局
      • 樣式與主題
    • 頁面路由與參數傳遞
      • 頁面跳轉
      • 參數接收
    • 數據綁定與循環渲染
      • 數據接口定義
      • 循環渲染
    • 條件渲染
    • 組件生命周期
    • 最佳實踐與性能優化
      • 組件復用
      • 響應式設計
      • 性能優化

前言

隨著華為HarmonyOS生態的不斷發展,越來越多的開發者開始關注并投入到HarmonyOS應用開發中。本文將通過一個實際的項目案例,詳細講解HarmonyOS應用開發的核心技術和最佳實踐,幫助開發者快速掌握HarmonyOS應用開發的要點。

項目概述

本項目是一個基于HarmonyOS的學習應用,主要包含了一個儀表盤示例頁面,用于展示業務數據概覽。項目采用了ArkTS語言開發,使用了HarmonyOS提供的UI框架和組件,實現了響應式布局和頁面路由等功能。

HarmonyOS應用架構

項目結構

HarmonyOS應用的項目結構遵循一定的規范,主要包括以下幾個部分:

  • entry:應用的入口模塊,包含了應用的主要代碼和資源
    • src/main/ets:ArkTS代碼目錄
      • entryability:應用的Ability實現,是應用的入口點
      • pages:應用的頁面組件
      • components:可復用的UI組件
      • common:公共工具和常量
    • src/main/resources:應用的資源文件,如圖片、字符串等
    • src/main/module.json5:模塊配置文件

Ability生命周期

Ability是HarmonyOS應用的基本組成單元,類似于Android的Activity。在本項目中,EntryAbility是應用的主入口,它的生命周期包括:

export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {// Ability創建時調用}onDestroy(): void {// Ability銷毀時調用}onWindowStageCreate(windowStage: window.WindowStage): void {// 窗口創建時調用,在這里加載主頁面windowStage.loadContent('pages/Index', (err) => {// 頁面加載回調});}onWindowStageDestroy(): void {// 窗口銷毀時調用}onForeground(): void {// Ability進入前臺時調用}onBackground(): void {// Ability進入后臺時調用}
}

ArkTS語言特性

ArkTS是HarmonyOS應用開發的首選語言,它基于TypeScript,增加了聲明式UI和狀態管理等特性。

裝飾器

ArkTS中的裝飾器是一種特殊的聲明,可以附加在類、方法、訪問器、屬性或參數上。本項目中使用了多種裝飾器:

  1. @Entry:標記一個組件為頁面入口
  2. @Component:定義一個自定義組件
  3. @State:定義組件內部的狀態變量,當狀態變化時會觸發UI刷新
  4. @Prop:用于父組件向子組件傳遞數據

例如,在NavBar組件中:

@Component
export struct Navbar {@Prop title: string = ''build() {// 組件UI構建}
}

狀態管理

ArkTS提供了多種狀態管理機制,用于處理組件內部狀態和組件間通信:

  1. @State:組件內部狀態,變化時會觸發組件重新渲染
  2. @Prop:父組件向子組件傳遞的屬性,子組件不能修改
  3. @Link:雙向綁定,父子組件可以共同修改
  4. AppStorage:應用級的狀態存儲

在DashboardExample組件中,使用@State管理數據:

@State screenWidth: number = 0
@State dataCards: DashboardCardItem[] = [{title: '今日銷售額', value: '8,846', unit: '元', trend: '+12.5%', color: '#2A9D8F'},// 其他數據...
]

UI組件與布局

基礎組件

HarmonyOS提供了豐富的基礎UI組件,本項目中使用了:

  1. Text:文本顯示組件
  2. Image:圖片顯示組件
  3. Column:垂直布局容器
  4. Row:水平布局容器
  5. Flex:彈性布局容器
  6. List:列表容器

響應式布局

HarmonyOS支持響應式布局,可以根據屏幕尺寸自適應調整UI。在DashboardExample中,通過檢測屏幕寬度實現響應式布局:

aboutToAppear() {// 獲取屏幕寬度,用于響應式布局this.screenWidth = px2vp(AppStorage.Get<number>('windowWidth') || 720)
}// 根據屏幕寬度決定每行顯示的卡片數量
Flex({ wrap: FlexWrap.Wrap, justifyContent: this.screenWidth > 600 ? FlexAlign.Start : FlexAlign.SpaceAround }) {// 卡片布局
}

樣式與主題

ArkTS支持鏈式調用設置組件樣式,使UI代碼更加簡潔:

Text(card.value).fontSize(28).fontWeight(FontWeight.Bold).fontColor(card.color)

還可以通過設置backgroundColor、borderRadius、shadow等屬性實現豐富的視覺效果:

.width(this.screenWidth > 600 ? '22%' : '45%')
.height(120)
.padding(16)
.margin(8)
.borderRadius(12)
.backgroundColor(Color.White)
// 添加卡片陰影效果
.shadow({radius: 4, color: '#1A000000', offsetY: 2})

頁面路由與參數傳遞

HarmonyOS提供了router模塊用于頁面間導航和參數傳遞。

頁面跳轉

在Index頁面中,通過router.pushUrl實現頁面跳轉:

router.pushUrl({url: item.path,params: {desc: item.desc,value: item.value}
})

參數接收

在目標頁面中,通過router.getParams獲取傳遞的參數:

onPageShow(): void {// 獲取傳遞過來的參數對象const params = router.getParams() as Record<string, string>;//   獲取傳遞的值if (params) {this.desc = params.desc as stringthis.title = params.value as string}
}

數據綁定與循環渲染

數據接口定義

使用TypeScript接口定義數據結構,提高代碼的可讀性和可維護性:

export interface DashboardCardItem {title: string;    // 卡片標題value: string;    // 數值內容unit: string;     // 數值單位trend: string;    // 趨勢變化color: string;    // 卡片主題顏色
}

循環渲染

使用ForEach語法實現列表循環渲染:

ForEach(this.dataCards, (card: DashboardCardItem) => {// 數據卡片UI構建
})

條件渲染

ArkTS支持在UI構建中使用條件表達式,實現動態UI:

// 根據趨勢是否為正值顯示不同顏色
Text(card.trend).fontSize(14).fontColor(card.trend.includes('+') ? '#2A9D8F' : '#E76F51')

組件生命周期

ArkTS組件有多個生命周期回調函數:

  1. aboutToAppear:組件即將出現時調用,用于初始化
  2. aboutToDisappear:組件即將消失時調用,用于清理資源
  3. onPageShow:頁面顯示時調用
  4. onPageHide:頁面隱藏時調用
  5. onBackPress:處理返回按鍵事件
aboutToAppear() {// 初始化工作this.screenWidth = px2vp(AppStorage.Get<number>('windowWidth') || 720)
}onPageShow(): void {// 頁面顯示時的處理const params = router.getParams() as Record<string, string>;// ...
}

最佳實踐與性能優化

組件復用

將通用UI封裝為可復用組件,如本項目中的NavBar組件:

@Component
export struct Navbar {@Prop title: string = ''build() {Row(){Image($r('app.media.tornLeft')).width(30).onClick(()=>{router.back()})Text(this.title).fontSize(20).fontWeight(800)}.justifyContent(FlexAlign.SpaceBetween).width('100%').height('50')}
}

響應式設計

根據不同屏幕尺寸調整布局,提升用戶體驗:

.width(this.screenWidth > 600 ? '22%' : '45%')

性能優化

  1. 懶加載:只在需要時加載組件和資源
  2. 狀態管理:合理使用狀態管理機制,避免不必要的重渲染
  3. 資源復用:復用組件和資源,減少內存占用

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

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

相關文章

【虛擬機 IP 配置深度剖析】

虛擬機 IP 配置深度剖析 在虛擬機的使用過程中&#xff0c;IP 配置猶如搭建房屋的基石&#xff0c;是確保虛擬機與外部網絡順暢通信、與其他設備高效交互的關鍵所在。本文將以 CentOS 虛擬機為例&#xff0c;深入解讀 IP 配置的奧秘。 一、認識網絡模式 ? NAT 模式&#xf…

【Python 數據結構 5.棧】

目錄 一、棧的基本概念 1.棧的概念 2.入棧 入棧的步驟 3.出棧 出棧的步驟 4.獲取棧頂元素 獲取棧頂元素的步驟 二、 Python中的棧 順序表實現 鏈表實現 三、棧的實戰 1.LCR 123. 圖書整理 I 思路與算法 2.LCR 027. 回文鏈表 思路與算法 3.1614. 括號的最大嵌套深度 思路與算法 …

Machine Learning 初探

前置知識 pandas 讀取文件&#xff1a;read_csv查看信息 describe&#xff1a;查看整體信息&#xff0c;包括每列的平均值、最大最小值、標準差等head&#xff1a;輸出頭部幾行數據columns&#xff1a;輸出所有列名loc&#xff1a;查詢數據&#xff0c;或是根據索引取對應的數…

2025年2月個人工作生活總結

本文為 2025年2月工作生活總結。 工作記錄 AI浪潮 AI非常火&#xff0c;春節至今&#xff0c;到處充斥著大量和AI、DeepSeek有關的新聞。領導也一再強調要用AI&#xff0c;甚至納入到新一年的考核里。再往上&#xff0c;大領導開會的新聞稿里也作出要求&#xff0c;不能停下腳…

SpringBoot @ConfigurationProperties 注解使用

ConfigurationProperties 用于將配置文件&#xff08;如 application.properties 或 application.yml&#xff09;中的屬性批量綁定到一個 Java Bean 中。 1. 定義配置文件 在 application.properties 或 application.yml 中定義一組具有相同前綴的屬性。 application.yml &a…

剛安裝docker并啟動docker服務: systemctl restart docker報錯解決

root:/home/lzw# sudo systemctl restart docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xeu docker.service" for details. 1、問題描述 啟動doc…

JavaScript的this指向,一次徹底講清楚

JavaScript 中的 this 指向是一個非常重要且容易混淆的概念。它的值取決于函數被調用的上下文,而不是函數定義的位置。以下是 this 指向的詳細解析: 1. 默認綁定(Default Binding) 在非嚴格模式下,如果函數是直接調用(而不是作為對象的方法或構造函數等),this 默認指向…

MFC: 控件根據文本內容大小自動調整

背景&#xff1a; 針對不同語言下&#xff0c;控件顯示不全的現象&#xff1b; 例如&#xff1a; 現象1&#xff1a;中文下顯示全部信息&#xff0c;英語下只能顯示部分文字 現象2&#xff1a;中文下顯示不全## 實現思路&#xff1a; 控件綁定按鈕計算控件文本長度根據文本長…

SpringBoot 整合mongoDB并自定義連接池,實現多數據源配置

要想在同一個springboot項目中使用多個數據源&#xff0c;最主要是每個數據源都有自己的mongoTemplate和MongoDbFactory。mongoTemplate和MongoDbFactory是負責對數據源進行交互的并管理鏈接的。 spring提供了一個注解EnableMongoRepositories 用來注釋在某些路徑下的MongoRepo…

軟件測試中的BUG

文章目錄 軟件測試的生命周期BugBug 的概念描述 Bug 的要素案例Bug 級別Bug 的生命周期與開發產生爭執怎么辦&#xff1f;【高頻面試題】先檢查自身&#xff0c;Bug 是否描述的不清楚站在用戶角度考慮并拋出問題Bug 的定級要有理有據提?自身技術和業務水平&#xff0c;做到不僅…

泵吸式激光可燃氣體監測儀:快速精準守護燃氣管網安全

在城市化進程加速的今天&#xff0c;燃氣泄漏、地下管網老化等問題時刻威脅著城市安全。如何實現精準、高效的可燃氣體監測&#xff0c;守護“城市生命線”&#xff0c;成為新型基礎設施建設的核心課題。泵吸式激光可燃氣體監測儀&#xff0c;以創新科技賦能安全監測&#xff0…

第J3-1周:DenseNet算法 實現乳腺癌識別

文章目錄 一、前言二、前期準備1.設置GPU2.劃分數據集 三、搭建網絡模型1.DenseLayer模塊2.DenseBlock模塊3.Transition模塊4.構建DenseNet5.構建densenet121 四、訓練模型1.編寫訓練函數2.編寫測試函數3.正式訓練 五、結果可視化1.Loss與Accuracy圖2.模型評估 總結&#xff1a…

【JAVA面試題】== 和 equals() 的區別與使用場景

在 Java 面試中&#xff0c; 和 equals() 的區別是一個高頻考點。理解它們的底層原理和使用場景&#xff0c;對于掌握 Java 基礎知識至關重要。本文將從 基本概念、底層實現 和 實際應用 三個方面&#xff0c;深入解析 和 equals() 的區別。 1. 基本概念 1.1 運算符 作用&a…

-bash: lsof: command not found

一、問題說明 執行如下命令時報錯&#xff1a; # lsof |grep deleted > deleted_file -bash: lsof: command not found二、處理方法 # yum -y install lsof安裝完成后可成功執行上面的命令。

攝像頭應用編程(三):多平面視頻采集

文章目錄 1、前言2、環境介紹3、步驟4、應用程序編寫5、測試5.1、編譯應用程序5.2、運行應用程序 6、總結 1、前言 在查看攝像頭類型時&#xff0c;大致可以分為兩類&#xff1a;Video Capture 和 Video Capture Multiplanar。 本次應用程序主要針對類型為Video Capture Multi…

本地部署 Traefik 的完整教程

Traefik 是一款現代化的反向代理和負載均衡工具,專為云原生環境設計。它支持自動服務發現、動態配置更新以及多種后端(如 Docker、Kubernetes、Consul 等)。本教程將指導你如何在本地部署 Traefik,并配置其作為反向代理和負載均衡器。 1. 準備工作 在開始之前,請確保你的…

三維數據可視化與表面重建:Marching Cubes算法的原理與應用

1. 引言 隨著現代醫學影像技術的飛速發展&#xff0c;三維數據的可視化與重建已成為醫學研究、臨床診斷和手術規劃的重要工具。在眾多三維重建算法中&#xff0c;Marching Cubes算法因其高效、穩定的特性成為從離散數據場中提取等值面的經典方法。本報告將深入探討Marching Cu…

MySql面試總結(二)

WHERE 子句優化 截至2024年7月,MySQL最新穩定版本是8.2,并不存在MySQL 8.4 。下面從常見的幾個方面為你介紹 MySQL 8.x 中 WHERE 子句的優化方法: 1. 確保使用索引 原理:索引可以加快數據的查找速度,當 WHERE 子句中的條件列有索引時,MySQL 可以直接定位到符合條件的數…

【圖論】判斷圖中有環的兩種方法及實現

判斷圖中有環的兩種方法及實現 在圖論中&#xff0c;檢測有向圖是否存在環是常見問題。本文將介紹兩種主流方法&#xff1a;DFS三色標記法和拓撲排序&#xff08;Kahn算法&#xff09;&#xff0c;并提供對應的C代碼實現。 方法一&#xff1a;DFS三色標記法 核心思想 通過深…

11.【線性代數】——矩陣空間,秩1矩陣,小世界圖

十一 矩陣空間&#xff0c;秩1矩陣&#xff0c;小世界圖 1. 矩陣空間交集 和 和集 2. 所有解空間3. r 1 r1 r1的矩陣4. 題目5. 小世界圖 空間&#xff1a;組成空間的元素的線性組合都在這個空間中。 1. 矩陣空間 舉例&#xff1a;矩陣空間&#xff08; M M M 所有3x3的矩陣&…