【HarmonyOS】List組件多層對象嵌套ForEach渲染更新的處理

【HarmonyOS】List組件多層對象嵌套ForEach渲染更新的處理

問題背景:
在鴻蒙中UI更新渲染的機制,與傳統的Android IOS應用開發相比。開發會簡單許多,開發效率提升顯著。

一般傳統應用開發的流程處理分為三步:1.畫UI,2.獲得or創建,處理數據,3.增刪改數據,找到對應控件,更新到UI上。

而鴻蒙應用開發,大大提供效率其中一點,就是減少了第三步。我們只需要關心數據源的變化,數據自動會更新到對應的控件上。

這種處理機制,其實符合應用開發的時代潮流,目前Android和IOS最新框架機制都有相應類似的處理。例如swiftUI,Compose。并且Vue,Flutter整個刷新機制就是如此。

眾所周知,在HarmonyOs的list組件渲染中,如果數據源列表對象是多個對象嵌套的處理,那最底層對象的屬性更新時,UI界面是不會渲染的。因為檢測不到,目前只能檢測到第一層對象。

解決方案:

當然官方的api在持續迭代的過程中。對于冗余渲染,渲染的性能提升,還有多層對象嵌套的數據源更新問題,一直再迭代方法處理。

針對多層對象嵌套,底層對象屬性修改后,UI不渲染的問題,有個比較簡單又方便的處理方式,思路僅供參考。

即:深拷貝修改的item對象。

這樣整個對象相當于都變化了,就符合第一層對象檢測的機制,可以被系統捕獲到刷新。

DEMO示例:

import { util } from '@kit.ArkTS';/*** 二級數據結構*/
class ChildInfo {index: number;constructor(index: number) {this.index = index;}
}/*** 一級數據結構*/
class ItemInfo {key: string = util.generateRandomUUID(true);name: string;icon: Resource;childInfo: ChildInfo;select: boolean;constructor(name: string, icon: Resource, index: number) {this.name = name;this.icon = icon;this.childInfo = new ChildInfo(index);this.select = false;}/*** 重新創建對象,深拷貝處理* @param itemInfo* @param index* @returns*/static deepCopy(itemInfo: ItemInfo, index: number){let info: ItemInfo = new ItemInfo(itemInfo.name, itemInfo.icon, index);info.select = itemInfo.select;info.key = itemInfo.key;info.childInfo = itemInfo.childInfo;return info;}
}/****/


struct ForeachPage {private TAG: string = "ForeachPage"; mListData: Array<ItemInfo> = [];aboutToAppear(): void {this.mListData.push(new ItemInfo('游戲', $r("app.media.iconA"), 1));this.mListData.push(new ItemInfo('游戲', $r("app.media.iconB"), 2));this.mListData.push(new ItemInfo('游戲', $r("app.media.iconA"), 3));this.mListData.push(new ItemInfo('游戲', $r("app.media.iconB"), 4));this.mListData.push(new ItemInfo('游戲', $r("app.media.iconA"), 5));this.mListData.push(new ItemInfo('游戲', $r("app.media.iconB"), 6));} ItemView(item: ItemInfo, index: number){Row() {Image(item.icon).width(px2vp(120)).height(px2vp(120))Text(item.name + "(" + item.childInfo.index + ")").fontSize(20)Blank()if(this.isLog(item, index)){if(item.select){Image($r("app.media.icon_check")).size({width: px2vp(72),height: px2vp(72)})}}}.width('100%').justifyContent(FlexAlign.Start).onClick(()=>{item.select = !item.select;if(item.select){item.childInfo.index = 666;}else{item.childInfo.index = index;}this.mListData[index] = ItemInfo.deepCopy(item, item.childInfo.index);console.log(this.TAG, " ItemView onClick: " + index + " item.select: " + item.select);})}private isLog(item: ItemInfo, index: number){console.log(this.TAG, " ItemView isLog index: " + index + " item.select: " + item.select);return true;}build() {List() {ForEach(this.mListData, (item: ItemInfo, index: number) => {ListItem() {this.ItemView(item, index)}}, (item: ItemInfo) => JSON.stringify(item))//}.width("100%").height("100%").padding({ left: px2vp(60), right: px2vp(60) })}
}

iconA
iconB
icon_check

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

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

相關文章

TiDB-從0到1-分布式存儲

TiDB從0到1系列 TiDB-從0到1-體系結構TiDB-從0到1-分布式存儲TiDB-從0到1-分布式事務TiDB-從0到1-MVCC 一、TiDB-DML語句執行流程&#xff08;增刪改&#xff09; DML流程概要 1、協議驗證 用戶連接到TiDB Server后首先工作的是Protocol Layer模塊&#xff0c;該模塊會對用…

mysql表字段超過多少影響性能 mysql表多少效率會下降

一直有傳言說&#xff0c;MySQL 表的數據只要超過 2000 萬行&#xff0c;其性能就會下降。而本文作者用實驗分析證明&#xff1a;至少在 2023 年&#xff0c;這已不再是 MySQL 表的有效軟限制。 傳言 互聯網上有一則傳言說&#xff0c;我們應該避免單個 MySQL 表中的數據超過 …

內網滲透-在HTTP協議層面繞過WAF

進入正題&#xff0c;隨著安全意思增強&#xff0c;各企業對自己的網站也更加注重安全性。但很多web應用因為老舊&#xff0c;或貪圖方便想以最小代價保證應用安全&#xff0c;就只僅僅給服務器安裝waf。 本次從協議層面繞過waf實驗用sql注入演示&#xff0c;但不限于實際應用…

[數據集][目標檢測]輪胎檢測數據集VOC+YOLO格式439張1類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;439 標注數量(xml文件個數)&#xff1a;439 標注數量(txt文件個數)&#xff1a;439 標注類別…

mysql怎么部署雙機

MySQL的雙機部署是為了實現數據的高可用性和容錯性。以下是MySQL雙機熱備部署的基本步驟&#xff0c;我會盡量清晰地分點表示和歸納&#xff1a; 1. 環境準備 安裝MySQL&#xff1a;在兩臺服務器上分別安裝MySQL數據庫。確保版本兼容。 網絡配置&#xff1a;確保兩臺服務器之…

題目:判斷一個素數能被幾個9整除

題目&#xff1a;判斷一個素數能被幾個9整除 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should …

顛仆流離學二叉樹2 (Java篇)

本篇會加入個人的所謂魚式瘋言 ??????魚式瘋言:??????此瘋言非彼瘋言 而是理解過并總結出來通俗易懂的大白話, 小編會盡可能的在每個概念后插入魚式瘋言,幫助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能說的不是那么嚴謹.但小編初心是能讓更多人…

泛型知識匯總

演示代碼&#xff1a; package exercise;import java.util.Arrays;public class MyArrayList<E> {Object[] obj new Object[10];int size;public boolean add(E e) {obj[size] e;size;return true;}public E get(int index) {return (E) obj[index];}//沒有這個函數&a…

現代信號處理12_譜估計的4種方法(CSDN_20240602)

Slepian Spectral Estimator(1950) 做譜估計的目標是盡可能看清楚信號功率譜在某一個頻率上的情況&#xff0c;假設我們想了解零頻時的分布&#xff0c;最理想的情況是濾波器的傳遞函數H(ω) 是一個沖激函數&#xff0c;這樣就沒有旁瓣&#xff0c;也就沒有泄漏&#xff1b;其次…

【OpenHarmony】TypeScript 語法 ③ ( 條件語句 | if else 語句 | switch case 語句 )

文章目錄 一、條件語句1、if else 語句2、switch case 語句 參考文檔 : <HarmonyOS第一課>ArkTS開發語言介紹 一、條件語句 1、if else 語句 TypeScript 中的 if 語句 / if else 語句 用法 , 與 JavaScript 語言中的 if 語句 / if else 語句 語法 基本相同 ; if else 語…

使用Java構建RESTful API:實現靈活、可擴展的Web服務

RESTful API已經成為構建現代Web應用的標準之一&#xff0c;它通過簡單的HTTP協議進行通信&#xff0c;提供了一種輕量級、靈活、可擴展的方式來構建和管理Web服務。Java作為一種強大的編程語言&#xff0c;提供了許多框架和庫來幫助開發者構建高效的RESTful API。本文將探討如…

項目質量管理

目錄 1.概述 2.三個關鍵過程 2.1.規劃質量管理&#xff08;Plan Quality Management&#xff09; 2.2.管理質量&#xff08;Manage Quality&#xff09; 2.3.控制質量&#xff08;Control Quality&#xff09; 3.應用場景 3.1.十個應用場景 3.2.產品設計與開發 4.小結…

使用PyCharm 開發工具創建工程

一. 簡介 前面學習了 安裝 python解釋器。如何安裝python的一種開發工具 PyCharm。 本文來簡單學習一下&#xff0c;如何使用 PyCharm 開發工具創建一個簡單的 python工程。 二. PyCharm 開發工具創建一個工程 1. 首先&#xff0c;首先打開PyCharm 開發工具。選擇 創建一…

Docker部署SiYuan筆記-Unraid

使用unraid的docker部署SiYuan筆記&#xff0c;簡單記錄 筆記說明 Siyuan筆記是一款基于markdown語法的筆記工具&#xff0c;具有活躍的社區和多設備支持。大部分功能都是免費&#xff0c;源代碼開源&#xff0c;支持插件安裝&#xff0c;具有很不錯的使用體驗。 Docker地址&a…

linux---生產者和消費者模型

生產者消費者模式就是通過一個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊&#xff0c;而通過阻塞隊列來進行通訊&#xff0c;所以生產者生產完數據之后不用等待消費者處理&#xff0c;直接扔給阻塞隊列&#xff0c;消費者不找生產者要數據&#…

2024年海南省三支一扶報名指南,照片要求

2024年海南省三支一扶報名指南&#xff0c;照片要求 一、考試時間安排&#xff1a; 報名時間&#xff1a;6月1日8:00至6月7日18:00 準考證打印時間&#xff1a;6月17日8:00 考試時間&#xff1a;6月22日 二、招聘人數 海南省計劃招募390名高校畢業生

STM32_IIC

1、IIC簡介 I2C&#xff0c;即Inter IC Bus。是由Philips公司開發的一種串行通用數據總線&#xff0c;主要用于近距離、低速的芯片之間的通信&#xff1b;有兩根通信線&#xff1a;SCL&#xff08;Serial Clock&#xff09;用于通信雙方時鐘的同步、SDA&#xff08;Serial Data…

JVM之【執行引擎】

執行引擎 執行引擎是JVM的核心組件之一&#xff0c;它負責將Java字節碼文件轉換為機器指令并執行。這一過程涉及多個組成部分&#xff0c;各部分協同工作來完成字節碼到機器指令的轉換和執行。以下是執行引擎的主要組成部分及其作用&#xff1a; 1. 解釋器&#xff08;Interp…

vue.js框架快速入門

Vue.js是一個漸進式JavaScript框架&#xff0c;用于構建用戶界面和單頁應用程序。以下是Vue.js快速入門的基本步驟和概念&#xff1a; 1. 環境準備 確保你的計算機上安裝了Node.js&#xff0c;它包括npm&#xff08;Node Package Manager&#xff09;&#xff0c;用于管理項目…

友善RK3399v2平臺利用rkmpp實現硬件編解碼加速

測試VPU 編譯mpp sudo apt update sudo apt install gcc g cmake make cd ~ git clone https://github.com/rockchip-linux/mpp.git cd mpp/build/linux/aarch64/ sed -i s/aarch64-linux-gnu-gcc/gcc/g ./arm.linux.cross.cmake sed -i s/aarch64-linux-gnu-g/g/g ./arm.lin…