【Harmony OS】【ArkUI】ets開發 基礎頁面佈局與數據連接

来源:https://www.cnblogs.com/developer-huawei/archive/2022/05/05/16224156.html
-Advertisement-
Play Games

前言 本篇是以 HarmonyOS 官網的基於 TS 擴展的聲明式開發範式文檔,頁面佈局與連接為基礎進行編寫。儘管原篇已非常精簡,但是作為初學者想要快速入門,使用 ets 方式實現出 List 佈局、Grid 佈局、數據連接及頁面跳轉功能,還是稍顯晦澀。所以筆者將原文進行整合,提取出其中的要點,以便 ...


前言

本篇是以 HarmonyOS 官網的基於 TS 擴展的聲明式開發範式文檔,頁面佈局與連接為基礎進行編寫。儘管原篇已非常精簡,但是作為初學者想要快速入門,使用 ets 方式實現出 List 佈局、Grid 佈局、數據連接及頁面跳轉功能,還是稍顯晦澀。所以筆者將原文進行整合,提取出其中的要點,以便通俗易懂地呈現給讀者,希望能幫助你快速瞭解 Harmony 的 ETS 開發,學會簡單的佈局與數據連接。本篇最後會貼上參考原文鏈接。

首先講一下大致的思路,我們要實現一個簡單的 List 頁面佈局、一個簡單的 Grid 頁面佈局,點擊頁面右上角的按鈕可以進行兩個佈局頁面的跳轉。List 佈局和 Grid 佈局中的每個 item 都對應著一條數據,並且也可以進行點擊跳轉到簡單的 detail 頁面。所以筆者將整個功能的實現分為了四個步驟,構建數據模型、構建列表 List 佈局、構建列表 Grid 佈局、頁面跳轉與數據傳遞,這與原篇大致相同。

1. 構建數據模型。

做菜首先需要備菜,數據模型是整個程式的內容,我們需要先準備好。但是因為我們是快速入門,就不需要細究細節,只要符合大概的邏輯即可。

這次我們需要準備的數據模型是食物數據模型,每個食物有食物名稱、卡路里、蛋白質、脂肪、碳水和維生素C的欄位。

1) 新建 model 文件夾,在 model 目錄下創建 FoodData.ets。

cke_2856.png

2) 定義食物數據的存儲模型 FoodData 和枚舉變數 Category,FoodData 類包含食物 id、名稱(name)、分類(category)、圖片(image)、熱量(calories)、蛋白質(protein)、脂肪(fat)、碳水(carbohydrates)和維生素C(vitaminC)屬性。

*eTS 語言是在ts語言的基礎上的擴展,同樣支持 ts 語法。

cke_4814.png

3) 存入食物圖片資源。在 resources > base > media 目錄下存入食物圖片資源,筆者這裡不究細節,就只用一個 icon.png 代替了。

cke_7655.png

4) 創建食物資源數據。在 model 文件夾下創建 FoodDataModels.ets,在該頁面中聲明食物成分數組 FoodComposition。

以12個食物數據為例,實際開發中,開發者可以自定義更多的數據資源,當食物資源很多時,建議使用數據懶載入LazyForEach。以下營養數據均來自網路。

創建 initializeOnStartUp 方法來初始化 FoodData 的數組。在 FoodDataModels.ets 中使用了定義在 FoodData.ets 的 FoodData 和 Category,所以要將 FoodData.ets 的 FoodData 類 export,在FoodDataModels.ets 內 import FoodData 和 Category。

cke_12426.png

2. 構建列表 List 佈局。

數據是整個程式的內容與血肉,頁面佈局則是整體的框架和骨骼。現在數據模型已經準備好,開始搭建整個程式的框架和構建整體的頁面佈局。

首先構建一個 List 列表佈局,使用 List 組件和 ForEach 迴圈渲染。這裡的 List 列表就和 Android 中的 ListView 有一點相似,大致的功能就是我們日常使用的 APP 的下拉列表。

1) 在 pages 目錄新建頁面 FoodCategoryList.ets,將 index.ets 改名為 FoodDetail.ets,並將其添加到 config.json 文件下的 pages 標簽,位於第一序位的頁面為首頁。

cke_17471.png

2) FoodCategoryList.ets 引入 FoodData 類和 initializeOnStartup 方法。

cke_23812.png

3) 新建 FoodList 組件作為頁面入口組件,FoodListItem 為其子組件。List組件是列表組件,適用於重覆同類數據的展示,其子組件為 ListItem,適用於展示列表中的單元。

cke_30667.png

4) 給 FoodListItem 添加一些細節。添加圖片和內容。

cke_37483.png

5) 給 FoodList 添加一些細節。添加標題,引入 ForEach 迴圈渲染每一條 item。

cke_44804.png

6) 打開模擬器或者預覽器,即可查看實現的 List 列表的效果。

cke_57591.png

3. 構建列表 Grid 佈局。

上面我們使用ets開發實現了 List 列表的功能,接下來我們使用ets來開發實現 Grid 列表。Grid 列表其實就是網格列表功能,和 Android 中的 GridView 有點類似。

頁面佈局上可以提供給用戶兩種顯示方式:列表顯示和網格顯示,實現通過頁簽切換不同分類的列表和網格佈局。

1) 將 Category 枚舉類型引入 FoodCategoryList 頁面,並且將原來引入 FoodData 的類註釋掉。

cke_65865.png

2) 新建 FoodGrid 組件作為頁面入口組件,FoodGridItem 為其子組件。Grid 組件是網格組件,適用於重覆同類數據的展示,其子組件為 GridItem,適用於展示列表中的單元。

cke_75179.png

3) 給 FoodGridItem 添加一些細節。展示食物圖片、名稱和卡路里,實現其UI佈局,為 GridItem 的子組件。每個 FoodGridItem 高度為184,行間距為8,設置 Grid 總高度為(184 + 8) * 6 - 8 = 1144。

cke_85301.png

4) 給 FoodGrid 添加一些細節。實現2 * 6的網格佈局(一共12個食物數據資源)。創建 Grid 組件,設置列數 columnsTemplate('1fr 1fr'),行數 rowsTemplate('1fr 1fr 1fr 1fr 1fr 1fr'),行間距和列間距 rowsGap 和 columnsGap 為8。創建 Scroll 組件,使其可以滑動。

cke_96458.png

5) 創建 FoodCategoryList 和 FoodCategory 組件,其中 FoodCategoryList 作為新的頁面入口組件,在入口組件調用 initializeOnStartup 方法。將原來的 FoodList 類的 initializeOnStartup 方法和 @Entry 去除。

cke_108344.png

6) 給 FoodCategory 添加一些細節。創建展示蔬菜(Category.Vegetable)、水果(Category.Fruit)、堅果(Category.Nut)、海鮮(Category.SeaFood)和甜品(Category.Dessert)分類的頁簽。

cke_119707.png

7) 給 FoodCategoryList 添加一些細節。在 FoodCategoryList 組件內創建 showList 成員變數,用於控制 List 佈局和 Grid 佈局的渲染切換。需要用到條件渲染語句 if...else...。在頁面右上角創建切換List/Grid 佈局的圖標。設置 Stack 對齊方式為頂部尾部對齊 TopEnd,創建 Image 組件,設置其點擊事件,即 showLis t取反。添加 @State 裝飾器。點擊右上角的 switch 標簽後,頁面沒有任何變化,這是因為 showList 不是有狀態數據,它的改變不會觸發頁面的刷新。需要為其添加 @State 裝飾器,使其成為狀態數據,它的改變會引起其所在組件的重新渲染。

cke_133072.png

8) 打開模擬器或者預覽器,即可查看實現的 List 列表的效果。點擊上面一排 tab 可以進行標簽切換,展示不同標簽對應的內容。點擊右上角可以進行 list 和 grid 的切換。

cke_145849.png

4. 頁面跳轉與數據傳遞。

上面我們已經完成了頁面佈局的搭建和讀取數據模型,接下來需要實現頁面跳轉和數據傳遞的功能。其實在上面兩個頁面佈局切換就已經用到了頁面跳轉,這次要實現的是 list 和 grid 的 item 點擊時跳轉到詳情界面,還有頁面跳轉時的數據傳遞功能。

頁面跳轉:點擊食物分類列表頁面的食物條目後,跳轉到食物詳情頁;點擊食物詳情頁的返回按鈕,返回到食物列表頁。

頁面間數據傳遞:點擊不同的食物條目後,FoodDetail 接受前一個頁面的數據,渲染對應的食物詳情頁。。

1) 點擊 FoodListItem 後跳轉到 FoodDetail 頁面。在 FoodListItem 內創建 Navigator 組件,使其子組件都具有路由功能,目標頁面 target為'pages/FoodDetail'。

點擊 FoodGridItem 後跳轉到 FoodDetail 頁面。調用頁面路由 router 模塊的 push 介面,將 FoodDetail 頁面推到路由棧中,實現頁面跳轉。使用 router 路由API介面,需要先引入 router。

這我們在上面都已添加,只需要再引入 router。

cke_160345.png

2) 在 FoodDetail 頁面增加回到食物列表頁面的圖標。在 resources > phone > media 文件夾下存入回退圖標 Back.png。新建自定義組件 PageTitle,包含後退的圖標和 Food Detail 的文本,調用路由的 router.back() 介面,彈出路由棧最上面的頁面,即返回上一級頁面。

cke_175243.png

3) 在 FoodDetail 組件內創建 Stack 組件,包含子組件 FoodImageDisplay 和 PageTitle 子組件,設置其對齊方式為左上對齊 TopStart。

cke_190672.png

4) FoodDetail 頁面 router 模塊,引入 FoodData 類,在 FoodDetail 組件內添加 foodItem 成員變數。

cke_207584.png

5) 重構 FoodDetail 頁面的組件。創建 FoodImageDisplay 類和 ContentTable 類,用於圖片和內容展示。

cke_224984.png

cke_237589.png

6) 打開模擬器或者預覽器,即可查看實現的 List 列表的效果。

cke_254314.png

以上,本次的內容分享,謝謝!

參考原文鏈接:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-ts-building-data-model-0000001146785866


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、Table API 和 Flink SQL 是什麼 Table API 和 SQL 集成在同一套 API 中。 這套 API 的核心概念是Table,用作查詢的輸入和輸出,這套 API 都是批處理和流處理統一的上層 API,這意味著在無邊界的實時數據流和有邊界的歷史記錄數據流上,關係型 API ...
  • 活動簡介 “開源之夏(英文簡稱 OSPP)” 是中科院軟體所 “開源軟體供應鏈點亮計劃” 指導下的一項面向高校學生的暑期活動,由中國科學院軟體研究所與 openEuler 社區共同舉辦。 2022 年為此系列活動的第三屆,開源之夏旨在鼓勵在校學生積极參与開源軟體的開發維護,促進優秀開源軟體社區的蓬勃 ...
  • 本文為墨天輪社區整理的2022年4月國產資料庫大事件和重要產品發佈消息。 ...
  • JSON 數據類型是 MySQL 5.7.8 開始支持的。在此之前,只能通過字元類型(CHAR,VARCHAR 或 TEXT )來保存 JSON 文檔。 相對字元類型,原生的 JSON 類型具有以下優勢: 在插入時能自動校驗文檔是否滿足 JSON 格式的要求。 優化了存儲格式。無需讀取整個文檔就能快 ...
  • JavaWeb連接MySQL資料庫 JavaWeb連接MySQL資料庫的方式有很多,首先我們講解JDBC的配置方法 一、JDBC的配置方法 1、什麼是JDBC 什麼是JDBC嘞?JDBC代表Java資料庫連接(Java Database Connectivity),它是用於Java編程語言和資料庫之 ...
  • App 性能優化 RecyclerView 1、onBindViewHolder 運行在 UI 線程,不宜進行邏輯等耗時操作,只適合把數據填入視圖; 2、使用 support 包下麵的 DiffUtil 局部刷新處理,DiffUtil(內部也是調用局部刷新方法)可以對比數據的差異,是否更改; Dif ...
  • OpenHarmony 社區的繁榮離不開合作伙伴的支持和貢獻,相容性工作組作為社區的一部分,我們將不斷優化測試用例和測評流程,為眾多提交測評的廠家提供支持。 ...
  • 原文地址:Android8.0 後臺服務保活的一種思路 | Stars-One的雜貨小窩 項目中有個MQ服務,需要一直連著,接收到消息會發送語音,且手機要在鎖屏也要實現此功能 目前是使用廣播機制實現,每次MQ收到消息,觸發一次啟動服務操作邏輯 在Android11版本測試成功,可實現上述功能 步驟 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...