《HarmonyOSNext的ForEach數組渲染の核心玩法與避坑指南》

《HarmonyOSNext教學寶典:ForEach數組渲染全攻略與性能優化》
#HarmonyOS開發 #ArkTS實戰 #組件解析

🎯 ForEach組件完全指南:數組循環渲染核心機制

舉個栗子🌰:
ForEach相當于智能印刷機,將數組元素自動轉化為UI組件!關鍵規則:??必須搭配特定容器??(如List中的ListItem

// 標準結構 ↓
ForEach(this.dataArray, (item: ItemType) => { /* 創建組件 */ }, (item: ItemType) => item.id /* 鍵值生成器 */
)

🔑 鍵值生成:組件的身份標識系統

ArkUI通過唯一鍵值(key) 追蹤組件狀態:

鍵值生成方式使用場景風險提示
(item,index) => index臨時測試數據變動導致組件錯亂 ??
item => item基礎類型不重復數組值重復時渲染異常 ??
item => item.id含ID的對象數組推薦方案?

📌 核心原則:鍵值重復會造成組件復用混亂(詳見問題排查章節)


🏗? 組件創建邏輯解析

場景1:首次渲染(新數組)
@State fruits: string[] = ['🍎','🍌','🍇'];build() {// 鍵值使用水果名稱(僅限不重復數組)ForEach(this.fruits, (fruit) => {Text(fruit).fontSize(20) }, (fruit) => fruit)
}

輸出結果:
🍎→新建組件 | 🍌→新建組件 | 🍇→新建組件


場景2:數據更新(非首次渲染)

點擊修改第三個元素

Button('更新').onClick(() => {this.fruits[2] = '🥝' // 替換元素
})
元素舊鍵值新鍵值結果
🍎🍎🍎復用
🍌🍌🍌復用
🥝🍇🥝新建

💡 關鍵結論:僅鍵值變化的元素觸發新建組件


🚀 四大實戰模板

模板1:骨架屏加載
@State skeletonData: number[] = [1,2,3,4,5] ForEach(this.skeletonData, () => ArticleSkeletonView(), (num) => num.toString() // 數字鍵值避沖突
)

模板2:加載更多功能
List().onReachEnd(() => {// ? 正確操作:追加含ID的新對象this.newsList.push({id: Date.now(), title:'最新消息'})
})ForEach(this.newsList, (news) => NewsCard({news}),(news) => news.id // ID鍵值保證精準更新
)

模板3:屬性監聽(點贊功能)
// 關鍵配置
@Observed class Post {likesCount: number = 0 
}@Component
struct PostCard {@ObjectLink post: Postbuild() {Button(`點贊 ${this.post.likesCount}`).onClick(() => this.post.likesCount++)}
}

模板4:拖拽排序
ForEach(this.dragItems, (item) => {ListItem() { ... }.onMove((from, to) => {// ? 維持鍵值不變,僅交換數組位置const movingItem = this.dragItems.splice(from,1)[0]this.dragItems.splice(to, 0, movingItem)})
}, (item) => item.id) // 固定ID鍵值!

?? 常見問題排查表

現象錯誤原因解決方案
新增數據渲染缺失使用索引(index)當鍵值改用對象唯一ID
拖拽后組件閃退數據重組時生成了新鍵值保持原始對象引用
屬性更新界面不變直接替換整個對象僅修改對象屬性字段
滾動加載全部重渲染鍵值生成規則不高效聲明簡單穩定鍵值(如ID)

💎 開發規范精要

// ? 安全高效的黃金寫法
ForEach(數據源, (item) => 組件實例, (item) => item.uniqueID // 三點核心價值:
)
  1. 精準更新 - 避免全量重渲染
  2. 數據安全 - 防止組件復用錯亂
  3. 性能保障 - 減少重復創建損耗

📢 重要提醒:

  • 基礎類型數組建議轉為{id:number, value:any}對象結構
  • 動態數組操作必須使用push()/splice()等變更檢測方法

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

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

相關文章

單片機 - STM32F407 ADC 模式詳解:單次轉換、連續轉換、掃描模式、非掃描模式

STM32F407 ADC 模式詳解:單次轉換、連續轉換、掃描模式、非掃描模式 前言 在 STM32F407 中,ADC(模數轉換器)模塊常用于采集模擬信號,比如讀取光敏電阻、電壓、電流、溫度傳感器等。STM32 的 ADC 模式較多&#xff0c…

開源模型應用落地-工具使用篇-從零開始搭建Qdrant Web UI-可視化管理工具-Windows(十)

一、前言 Qdrant 是一個高性能的向量搜索引擎,廣泛應用于相似性搜索、推薦系統和大規模數據檢索等場景。雖然其原生 API 提供了強大的功能,但對于開發者和運維人員來說,缺乏直觀的可視化界面常常增加了使用門檻。為了解決這一問題&#xff0c…

高頻交易技術:訂單簿分析與低延遲架構——從Level 2數據挖掘到FPGA硬件加速的全鏈路解決方案

高頻交易技術:訂單簿分析與低延遲架構——從Level 2數據挖掘到FPGA硬件加速的全鏈路解決方案 一、引言:高頻交易的技術本質 1.1 速度即利潤的微觀戰場 數據揭示:據NYSE實測,每降低1微秒延遲可獲得年化$700-1500萬套利窗口&#…

基于生成對抗網絡(GAN)的圖像生成與編輯:原理、應用與實踐

前言 生成對抗網絡(GAN)是近年來深度學習領域中最具影響力的技術之一。自2014年由Ian Goodfellow等人首次提出以來,GAN已經在圖像生成、圖像編輯、風格轉換等多個領域取得了令人矚目的成果。GAN的核心思想是通過生成器(Generator&…

pytorch基本運算-梯度運算:requires_grad_(True)和backward()

引言 前序學習進程中,已經對pytorch基本運算中的求導進行了基礎討論,相關文章鏈接為: 導數運算pytorch基本運算-導數和f-string-CSDN博客 實際上,求導是微分的進一步計算,要想求導的前一步其實是計算微分&#xff1…

idea64.exe.vmoptions配置

這個idea64.exe.vmoptions文件是用于配置 IntelliJ IDEA(64位版本)運行時的 Java 虛擬機(JVM)參數。這些參數直接影響到 IDEA 的性能、內存使用、調試能力和行為。 下面是對文件中每一行配置的詳細解讀: -Xms2048m 作…

齊次變換矩陣相乘的復合變換:左乘與右乘的深度解析

在三維幾何變換中,齊次變換矩陣相乘是實現復雜變換的核心方法。本文將通過一個包含四個變換步驟的完整示例,深入探討齊次變換矩陣左乘和右乘的區別,并結合 Python sympy 庫的代碼實現,詳細闡述變換過程和結果差異。 二維齊次坐標的旋轉變換 在二維齊次坐標系中,一個點可以…

5g LDPC編譯碼-LDPC編碼

目錄 1、LDPC編碼基礎知識 2、5g的LDPC編碼 2.1 LDPC分塊: 2.2 LDCP編碼 2.3 校驗位的產生 1、LDPC編碼基礎知識 LDPC屬于線性分組碼,線性分組碼的基本知識如下: 編碼后的碼字是由初始二進制序列與生成矩陣在二進制域相乘后得到,生成矩陣與校驗矩陣,校驗矩陣與編碼后…

OpenVINO使用教程--resnet分類模型部署

OpenVINO使用教程--resnet分類模型部署 本節內容模型準備推理測試分析&總結本節內容 OpenVINO 根據AI技術類型將部署任務分成傳統模型模型部署和生成式AI模型部署,傳統模型指的是各種CNN小模型,這部分部署只需要OpenVINO包,具體安裝教程可以參考之前的章節:OpenVINO環境…

無字母數字webshell的命令執行

在Web安全領域,WebShell是一種常見的攻擊手段,通過它攻擊者可以遠程執行服務器上的命令,獲取敏感信息或控制系統。而無字母數字WebShell則是其中一種特殊形式,通過避免使用字母和數字字符,來繞過某些安全機制的檢測。 …

C++斯特林數在C++中的數學理論與計算實現1

一、 斯特林數概述 1.1 組合數學中的核心地位 斯特林數(Stirling Numbers)是組合數學中連接排列、組合與分劃問題的核心工具,分為兩類: 第一類斯特林數(Stirling Numbers of the First Kind)&#xff1a…

[C++] STL大家族之<map>(字典)容器(附洛谷)

map-目錄 使用方法頭文件與聲明定義基本操作 使用方法 頭文件與聲明定義 頭文件是: #include <map>我們這樣聲明一個字典: map</*key_type*/, /*value_type*/> /*map_name*/; // 例子: map<int, char> mp;這里稍作解釋: key_type是你每個鍵值對中的鍵的…

使用 Flutter 在 Windows 平臺開發 Android 應用

以下是完整的開發流程&#xff0c;包括環境搭建、代碼實現和應用發布&#xff0c;幫助你開發一個具有地圖顯示、TCP 通信功能的 Android 應用。 一、環境搭建 1. 安裝 Flutter SDK 從 Flutter 官網 下載最新穩定版 SDK解壓到本地目錄&#xff08;如 D:\flutter&#xff09;添…

【模板】埃拉托色尼篩法(埃氏篩)

一、算法簡介 在數論與編程競賽中&#xff0c;求解 [ 1 , n ] [1,n] [1,n] 范圍內的所有質數是常見的基礎問題。埃拉托色尼篩法&#xff08;Sieve of Eratosthenes&#xff09; 是一種古老而高效的算法&#xff0c;可以在 O ( n log ? log ? n ) O(n \log \log n) O(nlogl…

AI Agent實戰 - LangChain+Playwright構建火車票查詢Agent

本篇文章將帶你一步步構建一個智能火車票查詢 Agent&#xff1a;你只需要輸入自然語言指令&#xff0c;例如&#xff1a; “幫我查一下6月15號從上海到南京的火車票” Agent就能自動理解你的需求并使用 Playwright 打開 12306 官網查詢前 10 條車次信息&#xff0c;然后匯總結果…

RabbitMQ的交換機和隊列概念

&#x1f3ea; 場景&#xff1a;一個外賣平臺的后臺系統 假設你開了一家在線外賣平臺&#xff1a; 飯店是消息的生產者&#xff08;Producer&#xff09;顧客是消息的消費者&#xff08;Consumer&#xff09;你開的外賣平臺就是RabbitMQ消息系統 &#x1f501; 第一部分&…

德國馬克斯·普朗克數學研究所:幾何朗蘭茲猜想

2025年科學突破獎 4月5日在美國洛杉磯揭曉&#xff1a;數學突破獎&#xff1a;德國馬克斯普朗克數學研究所&#xff1a;幾何朗蘭茲猜想 德國馬克斯普朗克數學研究所&#xff08;Max Planck Institute for Mathematics, MPIM&#xff09;在幾何朗蘭茲猜想的研究中扮演了核心角色…

TerraFE 腳手架開發實戰系列(一):項目架構設計與技術選型

TerraFE 腳手架開發實戰系列&#xff08;一&#xff09;&#xff1a;項目架構設計與技術選型 前言 在前端開發中&#xff0c;項目初始化往往是一個重復且繁瑣的過程。每次新建項目都需要配置 webpack、安裝依賴、設置目錄結構等&#xff0c;這些重復性工作不僅浪費時間&#…

準確--CentOS 7.9在線安裝docker

一、安裝Docker前的準備工作 操作系統版本為CentOS 7.9&#xff0c;內核版本需要在3.10以上。確保能夠連通互聯網&#xff0c;為避免網絡異常&#xff0c;建議關閉Linux的防火墻&#xff08;生產環境下請根據實際情況設置防火墻出入站規則&#xff09;。 # 查看內核版本 sudo…

中興B860AV1.1強力降級固件包

中興B860AV1.1強力降級固件包 關于中興b860av1.1頑固盒子降級教程終極版 將附件解壓好以后&#xff0c;準備一個8G以下的U盤重新格式化為FAT32格式后&#xff0c;并插入電腦 將以下文件及文件夾一同復制到優盤主目錄下&#xff08;見下圖&#xff09; 全選并復制到U盤主目錄下&…