【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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...