HarmonyOS 中狀態管理 V2和 V1 的區別

鴻蒙ArkUI框架中的ComponentV2與V1在狀態管理、組件開發模式、性能優化等方面存在顯著差異。以下是兩者的核心區別及技術解析:


一、狀態管理機制

V1的局限性

V1的@Observed裝飾器只能觀察對象的第一層屬性變化,需配合@ObjectLink手動拆解嵌套對象。例如:

@Observedclass Address { city: string }
@Observedclass User { address: Address }// V1中需通過自定義組件傳遞嵌套屬性
@Componentstruct AddressView {@ObjectLink address: Addressbuild() { Text(this.address.city) }}

若直接修改user.address.city,UI不會自動刷新。

修改對象屬性時,即使無關屬性變化也會觸發組件重渲染,導致性能浪費。

V2的增強

深度觀測@ObservedV2 + @Trace組合實現深度觀察,無需手動拆解對象:

@ObservedV2class Address { @Trace city: string }
@ObservedV2class User { @Trace address: Address }// V2直接觀察嵌套屬性
@ComponentV2struct UserProfile {@Local user: Userbuild() { Text(this.user.address.city) }}

修改user.address.city會精準觸發UI更新。

精準更新@Trace僅監聽被標記的屬性變化,避免冗余渲染。例如:

@ObservedV2class User {@Trace name: string // 僅監聽name變化age: number // 無@Trace則不監聽}

二、組件開發模式

V1的痛點
  1. 狀態傳遞復雜 父組件向子組件傳遞狀態需通過@Prop@Link,且@Prop為深拷貝(性能損耗),@Link需框架封裝雙向綁定。
  2. 組件復用困難 缺乏組件凍結機制,頻繁切換頁面時組件無法保持狀態,導致重復渲染。
V2的改進
  1. 聲明式狀態傳遞
  • @Param替代@Prop,支持引用傳遞(復雜類型無需深拷貝)。
  • @Event替代@Link,通過回調實現雙向綁定:
// V2子組件
@ComponentV2struct Child {@Param @Once value: number // 初始化時同步一次@Event update: () => voidbuild() {Button('Add').onClick(() => {this.value++ // 本地修改this.update() // 通知父組件})}}// V2父組件
@ComponentV2struct Parent {@Local value: number = 0build() {Child({ value: this.value, update: () => this.value++ })}}
  1. 組件凍結優化 通過freezeWhenInactive屬性凍結非激活組件,減少無效渲染:
@ComponentV2({ freezeWhenInactive: true })struct LazyComponent {// 非激活時(如路由切換)不會觸發UI更新}

三、性能優化

V1的缺陷
  • 代理層冗余 V1通過代理對象觀察數據變化,多層嵌套時代理層級過多,影響性能。
V2的優化

原生數據觀測 V2直接在數據對象上添加觀測能力,減少代理層級。例如:

@ObservedV2class Data {@Trace value: number // 數據本身可觀察}

按需更新@Computed裝飾器支持計算屬性,僅在依賴變化時重新計算:

@Computedget fullName() {return `${this.firstName} ${this.lastName}`}

四、混用與遷移策略

V1與V2的兼容性
  1. 單向兼容
  • V1組件可嵌入V2組件,但V2組件不可使用V1裝飾器。
  • V2通過@EnableV2Compatibility接口兼容V1狀態變量:
@Observedclass LegacyData { name: string }@ComponentV2struct V2Component {@Param legacyData: LegacyData = UIUtils.enableV2Compatibility(new LegacyData())}
  1. 漸進式遷移
  • 新功能直接使用V2開發。
  • 逐步替換V1組件,利用@Local@Param重構狀態傳遞。

五、開發體驗提升

  1. 裝飾器簡化 V2整合裝飾器功能,減少冗余代碼。例如:
  • @State@Local(僅組件內使用)
  • @Prop@Param(支持引用傳遞)
  1. 調試友好 V2提供更詳細的錯誤提示,如未初始化的@Param會直接報錯,避免運行時崩潰。

總結

特性

ComponentV1

ComponentV2

狀態觀測

淺層觀察,需@ObjectLink

深度觀測,@ObservedV2+@Trace

性能

代理層冗余,易冗余渲染

原生觀測,按需更新

組件復用

無凍結機制,切換卡頓

支持凍結,減少無效渲染

開發模式

聲明式受限,狀態傳遞復雜

聲明式增強,@Param/@Event簡化

兼容性

僅支持舊版ArkUI

漸進式遷移,兼容V1狀態變量

遷移建議:新項目直接采用V2;存量項目優先替換狀態管理模塊,逐步遷移組件庫。

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

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

相關文章

centos7 安裝jenkins

文章目錄前言一、pandas是什么?二、安裝依賴環境1.前提準備2.安裝git3.安裝jdk,以及jdk版本選擇4.安裝maven5.安裝NodeJS6.驗證三、安裝Jenkins四、驗證Jenkins總結前言 正在學習jenkinsdocker部署前后端分離項目,安裝jenkins的時候遇到了一…

Leetcode刷題營第二十題:刪除鏈表中的重復節點

面試題 02.01. 移除重復節點 編寫代碼,移除未排序鏈表中的重復節點。保留最開始出現的節點。 示例1: 輸入:[1, 2, 3, 3, 2, 1]輸出:[1, 2, 3]示例2: 輸入:[1, 1, 1, 1, 2]輸出:[1, 2]提示&…

關于市場主流自動化測試工具和框架的簡要介紹

下面我會分別講解 Selenium、Appium、Playwright 等主流自動化框架的區別、聯系、適用場景和歸屬范疇,幫助你更系統地理解它們。🔧 一、它們都屬于哪一類工具?Selenium、Appium、Playwright、Cypress 等都屬于:?? 自動化測試框架…

基于cornerstone3D的dicom影像瀏覽器 第三十二章 文件夾做pacs服務端,fake-pacs-server

文章目錄 前言一、實現思路二、項目與代碼三、dicom瀏覽器調用1. view2d.vue前言 本系列最后一章,提供一個模擬pacs服務,供訪問dicom圖像測試。 修改nodejs本地目錄做為http服務根目錄,提供一個根目錄,其中的每個子目錄代表一個檢查。在dicom瀏覽器url中帶入參數studyId=目…

【Python 核心概念】深入理解可變與不可變類型

文章目錄一、故事從變量賦值說起二、不可變類型 (Immutable Types)三、可變類型 (Mutable Types)四、一個常見的陷阱:當元組遇到列表五、為什么這個區別如此重要?1. 函數參數的傳遞2. 字典的鍵 (Dictionary Keys)3. 函數的默認參數陷阱六、進階話題與擴展…

wpf使用webview2顯示網頁內容(最低兼容.net framework4.5.2)

wpf使用webview2顯示網頁內容(最低兼容.net framework4.5.2 一、核心功能與架構混合開發支持?進程隔離模型?通信機制?二、核心優勢性能與兼容性?跨平臺部署?開發效率?安全機制?三、適用場景四、開發部署要點WebView2 是微軟推出的現代瀏覽器控件,基于 Chromium 內核的 …

MySQL斷開連接后無法正常啟動解決記錄

問題現象 夜里23點MySQL在還原備份的時候斷開連接,嘗試重啟,表面上是運行中實際上無法通過命令端連接,無法正常啟動。 問題檢查 可以使用 systemctl start mysql 但是沒有監聽 3306端口 mysql -ucosmic -p 提示無法找到socket文件 刪除原先的…

隧道安全監測系統的應用意義

隨著我國交通基礎設施建設的快速發展,公路、鐵路及城市地鐵隧道數量不斷增加,隧道安全問題日益凸顯。隧道作為地下封閉空間,受地質條件、施工質量、運營環境等多因素影響,易出現結構變形、滲漏水、襯砌開裂等安全隱患。一旦發生事…

前端UI邏輯復雜可以用什么設計模式

中介者模式 當UI組件間存在復雜交互或多個組件需共享狀態時,中介者模式能集中管理事件分發和狀態更新,減少組件間的直接依賴,提升解耦性。 vue實現中介者模式 在Vue中實現中介者模式,你可以通過創建一個全局的事件中心&#xff08…

WIFI協議全解析05:WiFi的安全機制:IoT設備如何實現安全連接?

🔐 WiFi的安全機制:IoT設備如何實現安全連接?“我的設備明明連上WiFi了,為什么還是能被‘蹭網’?” “WPA3 是什么?ESP32 支持嗎?” “我做了MQTT加密就算安全了嗎?”IoT設備連接WiF…

HTTP 請求體類型詳解:選擇最適合的數據提交格式

HTTP 請求體類型詳解:選擇最適合的數據提交格式 🚀 本文全面解析 HTTP 請求中不同 Content-Type 的適用場景、數據結構與優劣勢,幫助開發者高效選擇數據傳輸方案。 📌 目錄 核心請求體類型對比詳細類型解析最佳實踐指南總結 &am…

C語言 | 函數核心機制深度解構:從底層架構到工程化實踐

個人主頁-愛因斯晨 文章專欄-C語言 引言 最近偷懶了,迷上了三國和李賀。給大家分享一下最喜歡的一句詩:吾不識青天高黃地厚,唯見月寒日暖來煎人壽。我還不是很理解27歲的李賀,如何寫出如此絕筆。 正文開始,今天我們…

uniapp真機調試“沒有檢測到設備,請插入設備或啟動模擬器后點擊刷新再試”

當真機調試,運行到安卓 APP基座 時,有時會檢測不到設備,顯示下面的問題:此時,可以通過下面的幾種方法進行排查:1.在手機中找到“開發者選項”選項(可在設置中搜索,如搜索不到&#x…

使用langchain連接llama.cpp部署的本地deepseek大模型開發簡單的LLM應用

langchain是一個基于python實現的開源LLM開發框架,llama.cpp是一個基于C框架可以在本地部署大模型并開放服務端接口開放給外部應用使用。 本文結合langchain和llama.cpp,在本地部署輕量級的deepseek大模型,并構建一個簡單的鏈式LLM應用&…

Serverless 數據庫來了?無服務器數據庫 vs 傳統數據庫有何不同?

隨著云計算技術的迅猛發展,無服務器(Serverless)架構逐漸成為一種主流趨勢。其中,Serverless 數據庫作為云原生應用的重要組成部分,為開發者提供了前所未有的靈活性和成本效益。相比傳統的數據庫管理方式,S…

【讀書筆記】如何畫好架構圖:架構思維的三大底層邏輯

【讀書筆記】如何畫好架構圖:架構思維的三大底層邏輯 架構圖并非技術人的“畫功比拼”,而是一個團隊、一個系統、一次項目從混沌走向清晰的關鍵抓手。它是系統的視覺語言,是讓技術人員、產品經理、運營甚至老板都能站在統一上下文下討論的“…

Maven 編譯過程中發生了 Java Heap Space 內存溢出(OutOfMemoryError)

這個是我最近遇到的,因為本人最近換了電腦,這個電腦的前任是配置好了環境,但是當我用這個環境去做另外一個項目的時候,在maven構建war和jar包的時候,報了這個內存溢出mvn clean install 就給我報錯了[ERROR] Failed to…

C++ 模板參數展開

C 模板參數展開一、獲取可變參數大小二、通過模版循環繼承的方式來展開可變參數三、改用Using去實現循環繼承一、獲取可變參數大小 背景&#xff1a; FLen<int, char, long> Len; 我想要獲取模板參數類型的總大小 template<typename T,typename ...ParamTypes> c…

零基礎入門物聯網-遠程門禁開關:云平臺創建

一、 onenet云平臺注冊創建 遠程開關的信息傳輸依賴云平臺&#xff0c;本教程以 OneNET - 中國移動物聯網開放平臺為例進行操作&#xff0c;具體步驟如下&#xff1a; 1、平臺賬號創建 點擊 OneNET - 中國移動物聯網開放平臺進入官網 點擊頁面中的 “登錄” 按鈕&#xff0c;…

html頁面,當鼠標移開A字標就隱藏顏色框

html頁面代碼&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>顏色選擇器</title><style>body {font-family: "Microsoft YaHei", sans-serif;padding: 20px;}.c…