主頁 > 移動端開發 > 【Harmony OS】【ArkUI】ets開發 基礎頁面布局與資料連接

【Harmony OS】【ArkUI】ets開發 基礎頁面布局與資料連接

2022-05-06 08:25:00 移動端開發

前言

本篇是以 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

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/469752.html

標籤:其他

上一篇:HMS Core分析服務助您掌握用戶分層密碼,實作整體收益提升

下一篇:OpenHarmony兼容性平臺更新上線

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more