鴻蒙 Grid 與 GridItem 深度解析:二維網格布局解決方案

一、引言:網格布局 —— 多維度數據展示的黃金方案

在鴻蒙應用開發體系中,網格布局作為處理多元素有序排列的核心方案,廣泛應用于電商商品陳列、圖片畫廊、功能矩陣等場景。鴻蒙提供的 Grid 與 GridItem 組件通過聲明式語法構建靈活的二維布局系統,支持行列比例分配、單元格合并、滾動交互等高級特性,相比傳統線性布局可提升 30% 的復雜界面開發效率。本文將系統解析這組黃金搭檔的核心機制與工程實踐,幫助開發者掌握多維度數據可視化的鴻蒙解法。

二、核心架構:Grid 與 GridItem 的協作模型

2.1 組件定位與層級關系

  • Grid:網格容器組件,負責定義行列結構、間距規則、滾動方向等全局布局參數
  • GridItem:網格項組件,作為 Grid 的直接子組件,支持單元格跨行列合并與個性化配置

典型層級結構示意圖:

Grid (網格容器)
├─ GridItem (占據第1行第1列)
├─ GridItem (占據第1行第2-3列)
└─ GridItem (占據第2-3行第1列)

2.2 核心技術優勢

  • 響應式布局:通過fr彈性單位實現屏幕自適應,適配手機 / 平板 / 車機等多端設備
  • 靈活布局能力:支持單元格跨越多行多列,滿足日歷、計算器等復雜布局需求
  • 高性能渲染:結合 LazyForEach 實現大數據量懶加載,列表渲染性能提升 50%

三、Grid 核心屬性:構建網格骨架

3.1 行列結構配置

行列模板定義

通過rowsTemplate/columnsTemplate聲明行列比例,支持 fr 彈性單位與固定值混合使用:

Grid().rowsTemplate('80vp 1fr')      // 首行固定80vp,次行彈性填充.columnsTemplate('1fr 2fr 1fr') // 三列按1:2:1比例分配.rowsGap(12)                   // 行間距12vp.columnsGap(16)                // 列間距16vp
fr 單位計算邏輯
  • 1fr 表示 1 份彈性空間,總份數由聲明的 fr 數量決定
  • 示例:columnsTemplate('1fr 2fr')表示兩列寬度比為 1:2

3.2 滾動與布局控制

水平滾動網格
Grid().rowsTemplate('1fr')            // 單行布局.columnsTemplate('1fr 1fr 1fr') // 三列結構.height(200)                    // 固定高度觸發水平滾動.scrollBar(BarState.Auto)       // 自動顯示滾動條
垂直滾動網格
Grid().columnsTemplate('1fr')          // 單列布局.rowsTemplate('1fr 1fr 1fr')     // 三行結構.width(300)                     // 固定寬度觸發垂直滾動.edgeEffect(EdgeEffect.Spring)   // 邊緣彈性效果
流式布局模式

未設置行列模板時,通過layoutDirection控制排列方向:

Grid().layoutDirection(GridDirection.Row) // 水平排列(默認).maxCount(4)                       // 每行最多4個單元格

四、GridItem 核心屬性:單元格個性化定制

4.1 跨行列合并

通過rowStart/rowEndcolumnStart/columnEnd定義單元格占據范圍(行列號從 1 開始):

GridItem().columnStart(1)    // 起始列1.columnEnd(3)      // 結束列3(占據2列).rowStart(2)       // 起始行2.rowEnd(4)         // 結束行4(占據3行)

實戰案例:計算器按鍵布局

GridItem() { Text('0') }.columnStart(1).columnEnd(3)      // 占據2列寬度

4.2 性能優化控制

通過forceRebuild控制組件重建時機:

GridItem().forceRebuild(false) // 禁止隨父組件重建(適用于靜態內容)

設置在觸發組件build時是否重新創建此節點。GridItem會根據自身屬性和子組件變化自行決定是否需要重新創建,無需設置。?

五、實戰案例:從基礎到復雜的網格開發

5.1 基礎九宮格圖片墻

@Entry
@Component
struct ImageGrid {private images: string[] = Array(9).map((i:number) => `img_${i + 1}`);build() {Grid() {ForEach(this.images, (img:string) => {GridItem() {Image(img).width('100%').height('100%').objectFit(ImageFit.Cover).borderRadius(8)}})}.rowsTemplate('1fr 1fr 1fr').columnsTemplate('1fr 1fr 1fr').rowsGap(10).columnsGap(10).width('100%').height(300)}
}

5.2 水平滾動商品列表

interface Product {id: number;name: string;price: number;image: string;
}@Entry
@Component
struct ProductGrid {// 顯式聲明數組類型并初始化private products: Product[] = [{ id: 1, name: "商品1", price: 99, image: "img1" },{ id: 2, name: "商品2", price: 199, image: "img2" }// 實際項目應通過API獲取數據];build() {Grid() {// 顯式聲明LazyForEach參數類型LazyForEach(this.products, //這里需要DataSource類型,而不是Product[] 我偷點懶直接用了(item: Product) => {GridItem() {ProductCard({ productData: item }) // 傳遞顯式類型參數}.width('25%')},(item: Product) => item.id.toString() // 確保key為string類型)}.rowsTemplate('1fr').height(200).columnsGap(12).width('100%').cachedCount(5)}
}// 商品卡片組件需明確定義props類型
@Component
struct ProductCard {@ObjectLink productData: Product; // 使用ObjectLink監聽對象變化build() {Column() {Image(this.productData.image).width(80).height(80)Text(this.productData.name).fontSize(14)Text(`¥${this.productData.price.toFixed(2)}`).fontColor(Color.Red)}.padding(10)}
}

5.3 復雜日歷布局

    Grid() {// 標題行(跨全列)GridItem() { Text('2023年12月') }.columnStart(1).columnEnd(8) // 7列+1邊距// 星期標題ForEach(['日', '一', '二', '三', '四', '五', '六'], (title, idx) => {GridItem() { Text(title) }.width('14.28%') // 7列均分})// 日期單元格(周末跨2列)ForEach(this.calendarData, (date:CalendarData) => {GridItem() { Text(date.day) }.width(date.isWeekend ? '28.56%' : '14.28%') // 周末占2列})}.columnsTemplate('1fr 1fr 1fr 1fr 1fr 1fr 1fr') // 7列結構

六、工程實踐最佳指南

6.1 性能優化策略

大數據量懶加載
Grid() {LazyForEach(largeData, (item) => GridItem(), item => item.id)
}
.cachedCount(8) // 預加載當前顯示項前后各8個
.useVirtualized(true) // 啟用虛擬列表(API 10+)
復雜布局優化
  • 避免超過 3 層的網格嵌套
  • 固定高度 / 寬度的網格項使用.itemSize()聲明,提升布局計算效率

6.2 多端適配方案

#if (DeviceType == DeviceType.Phone)Grid().columnsTemplate('1fr 1fr') // 手機端2列
#elif (DeviceType == DeviceType.Tablet)Grid().columnsTemplate('1fr 1fr 1fr') // 平板端3列
#elif (DeviceType == DeviceType.Desktop)Grid().columnsTemplate('1fr 1fr 1fr 1fr') // 桌面端4列
#endif

6.3 常見問題解決方案

問題場景解決方案
單元格溢出檢查 GridItem 是否設置width/height: 100%,并通過maxWidth/maxHeight限制
滾動失效確認僅設置單行 / 單列模板,且內容超出容器尺寸,可添加.scrollBar(BarState.Always)強制顯示
合并錯亂確保rowEnd/columnEnd不超過 Grid 的行列總數,行列號從 1 開始計數
性能卡頓大數據量場景使用LazyForEach+cachedCount,避免使用ForEach直接渲染

七、總結:網格布局的全場景應用

鴻蒙 Grid 與 GridItem 組件通過聲明式語法將復雜二維布局轉化為結構化配置,核心能力包括:

  1. Grid 容器:行列模板定義、間距控制、滾動管理
  2. GridItem 項:跨行列合并、性能優化控制
  3. 工程實踐:懶加載、多端適配、性能調優

在實際開發中,建議遵循 "先結構后細節" 的開發流程:先通過 Grid 定義行列骨架,再通過 GridItem 實現單元格個性化。隨著鴻蒙生態向全場景設備拓展,網格布局在大屏設備(如平板、智慧屏)上的優勢將更加顯著,開發者可結合官方模擬器的多設備預覽功能,打造適配全場景的網格界面。

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

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

相關文章

??Vue 開發環境配置:使用 devServer.proxy 解決跨域問題?-vue中文件vue.config,js中配置devserver做反向代理到后端

??Vue 開發環境配置:使用 devServer.proxy 解決跨域問題?? ??引言?? 在現代 Web 開發中,前端和后端通常獨立開發,前端運行在 http://localhost:8080,而后端可能運行在 http://localhost:8000 或其他端口。由于瀏覽器的 …

JVM 中的 GC 算法演進之路!(Serial、CMS、G1 到 ZGC)

引言 想象一下,Java 程序運行就像在一個巨大的圖書館里借書還書。這個圖書館(JVM 的內存堆區)為了高效運轉,需要一個聰明的“圖書管理員”來清理失效的書籍(垃圾對象)。這,就是垃圾回收器&#…

(9)python+playwright自動化測試-頁面(page)

1.簡介 通過前邊的講解和學習,細心認真地你可能發現在Playwright中,沒有Element這個概念,只有Page的概念,Page不僅僅指的是某個頁面,例如頁面間的跳轉等,還包含了所有元素、事件的概念,所以我們…

《自動控制原理 》- 第 1 章 自動控制的基本原理與方式

1-1 自動控制的基本原理與方式 自動控制是指在沒有人直接參與的情況下,利用外加的設備或裝置,使機器、設備或生產過程的某個工作狀態或參數按照預定的規律運行。自動控制的核心原理是反饋控制,即通過將系統的輸出量回送到輸入端,與…

DL00715-基于YOLOv11的水面漂浮物目標檢測含數據集

【論文必備】基于YOLOv11的水面漂浮物目標檢測——讓你的研究走在科技前沿! 在環境監測、海洋保護和水質管理領域,水面漂浮物的檢測一直是一個亟待解決的難題。傳統的人工巡檢方式不僅耗時費力,還無法覆蓋廣泛的水域范圍。如今,基…

權電阻網絡DAC實現電壓輸出型數模轉換Multisim電路仿真——硬件工程師筆記

目錄 1 基礎知識 1.1 運算放大器在DAC中的作用 1.2 常見的基于運算放大器的DAC電路 1.2.1 倒T形電阻網絡DAC 1.2.2 權電阻網絡DAC 1.2.3 開關電容DAC 1.3 運算放大器的選擇 1.4 設計注意事項 2 仿真實驗 2.1 權電阻網絡DAC實現數字0對應電壓輸出 2.2 權電阻網絡DAC實…

Redis主從集群

? 一、什么是 Redis 主從集群? Redis 主從(Master-Slave)集群是一種最基礎的集群方式: 一臺 Redis 作為主節點(Master),負責寫操作; 一到多臺 Redis 作為從節點(Slave&…

【水印論文閱讀1】將水印規則的定義域從離散的符號空間轉移到連續的語義空間

【水印論文閱讀1】將水印規則的定義域從離散的符號空間轉移到連續的語義空間 寫在最前面**為什么“token序列空間”有根本缺陷?****為什么“語義向量空間”能破局?****1. 連續性(抗攻擊的核心)****2. 高維復雜性(防破解…

Glide緩存機制

一、緩存層級與設計目標 雙級緩存: 內存緩存:弱引用 LruCache 磁盤緩存:DiskLruCache 設計目標: 減少網絡流量消耗 避免Bitmap頻繁創建/銷毀引發的GC 提升圖片加載速度 二、內存緩存機制 1. 雙緩存結構 緩存類型存儲對象…

BaiduSitemap - Typecho站點地圖生成與多搜索引擎推送插件

文章目錄 ?? BaiduSitemap - Typecho站點地圖生成與多搜索引擎推送插件? 功能特點?? 插件架構核心模塊文件結構?? 安裝方法方法一:手動安裝方法二:Git克隆?? 配置說明站點地圖基本設置搜索引擎配置百度搜索引擎必應(Bing)搜索引擎谷歌(Google)搜索引擎?? 使用…

androidx中<layout>根布局的意義及用法

在 Android 開發中,<layout> 根布局是 Android Jetpack Data Binding 庫的核心組件,用于聲明該 XML 布局文件將使用數據綁定功能。以下是詳細說明: ?? 一、基本作用 1. 啟用數據綁定 <layout> 標簽標志著此布局文件支持數據綁定,編譯器會為其生成對應的綁定類…

QTreeWidget 簡單使用

效果圖&#xff1a; 關鍵代碼&#xff1a; void MainProj::_InitTree() { connect(m_pTreeWidget, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(TreeItemClicked(QTreeWidgetItem*, int))); m_pTreeWidget->header()->setHidden(1); /*QTreeWid…

手勢-handpose的pipeline介紹

手勢-handpose的pipeline包括&#xff1a; 1、手部檢測算法&#xff1a;單幀檢測出左右手的邊界框。 2、手部跟蹤算法&#xff1a;連續幀跟蹤&#xff0c;鎖定左右手跟蹤目標&#xff0c;作為后續的手部ui操作。 3、手部關鍵點檢測算法&#xff1a;基于單幀的檢測框圖像作為輸…

計算機操作系統(十七)內存管理

計算機操作系統&#xff08;十七&#xff09;內存管理 前言一、內存的使用與程序重定位&#xff08;一&#xff09;內存是什么&#xff1f;&#xff08;二&#xff09;程序的重定位過程&#xff08;三&#xff09;總結&#xff1a;內存使用的核心問題 二、連續分區管理&#xf…

【編譯原理】期末

單選題 (4分) 令文法G[E]為&#xff1a;E->ET | T T->T*F | F F-> (E) | i 句型 F*iT 的最左素短語是&#xff08; &#xff09; A.F B.i C.T D.F*i B 短語&#xff1a; F*iT、F*i、F、i 素短語&#xff1a; i 最左素短語&#xff1a; i 單選題 (4分) 若在…

一個簡單測試Deepseek吞吐量的腳本,國內環境可跑

一個簡單測試Deepseek吞吐量的腳本,這里用DeepSeek-R1-Distill-Qwen-32B ,支持單卡4090 24G可跑,具體看你的硬件情況做調整,理論支持所有的模型,看你需要,可以修改模型名稱,重點是pip使用國內的源,模型下載用阿里的ModelScope,無障礙下載,使用. 最后可以生成一個txt與html報表.…

前端基礎知識JavaScript系列 - 19(正則表達式)

一、是什么 正則表達式是一種用來匹配字符串的強有力的武器 它的設計思想是用一種描述性的語言定義一個規則&#xff0c;凡是符合規則的字符串&#xff0c;我們就認為它“匹配”了&#xff0c;否則&#xff0c;該字符串就是不合法的 在 JavaScript中&#xff0c;正則表達式也…

Java鎖機制知識點

一、鎖的基礎概念 1.1 什么是鎖 在并發編程中&#xff0c;鎖是用于控制多個線程對共享資源進行訪問的機制。鎖可以保證在同一時刻最多只有一個線程訪問共享資源&#xff0c;從而保證數據的一致性。 1.2 鎖的分類 可重入鎖 vs 不可重入鎖&#xff1a;可重入鎖允許同一個線程…

2025下半年軟考軟件設計師(中級)怎么高效備考,目標是穩過線!

25下半年軟考開始進入備考階段&#xff0c;現在咱們就拋開那些文縐縐的官話&#xff0c;用大白話來聊聊2025下半年軟考軟件設計師&#xff08;中級&#xff09;怎么高效備考&#xff0c;目標是穩過線&#xff01; 核心思想&#xff1a;抓大放小&#xff0c;真題為王&#xff0…

Jupyter常見操作(持續更新)

Jupyter常見操作&#xff08;持續更新&#xff09; 本文主要整理一些常見的或者比較簡單的Jupyter操作&#xff0c;盡量保證一次性整理出來&#xff0c;方便需要但是忘記的情況下可以直接查&#xff0c;希望能當字典。 1.查看Jupyter內核 jupyter kernelspec list 2.使用指定…