鴻蒙狀態管理概述 v2

狀態管理v2

  • 概述
  • 狀態管理之v2
    • @ObservedV2 和 @Trace
      • 狀態管理V1版本對嵌套類對象屬性變化直接觀測的局限性
      • ObservedV2 和 Trace 使用場景
    • @Local
      • 狀態管理V1版本@State裝飾器的局限性
    • @Param
      • 狀態管理V1版本接受外部傳入的裝飾器的局限性
    • @Once
    • @Event
    • @Computed
      • Computed 使用場景
    • @Type
    • PersistenceV2
    • AppStorageV2
    • !!語法
    • Repeat
    • getTarget
    • makeObserved

概述

為了增強狀態管理框架對類對象中屬性的觀測能力,開發者可以使用@ObservedV2裝飾器和@Trace裝飾器裝飾類以及類中的屬性。

@Trace裝飾器與現有狀態管理框架的@Track與@State裝飾器的能力不同,@Track使class具有屬性級更新的能力,但并不具備深度觀測的能力;而@State只能觀測到對象本身以及第一層的變化,對于多層嵌套場景只能通過封裝自定義組件,搭配@Observed和@ObjectLink來實現觀測。

狀態管理之v2

  • @ObservedV2 和 @Trace:類屬性變化觀測
  • @ComponentV2:自定義組件,對應v1的@Component
  • @Local:組件內部狀態,對應v1的@State
  • @Param:組件外部輸入
  • @Once:初始化同步一次
  • @Event:組件輸出
  • @Monitor:狀態變量修改監聽,對應v1的@Watch
  • @Provider 和 @Consumer:跨組件層級雙向同步,對應v1的@Provide和@Consume
  • @Computed:計算屬性
  • @Type:標記類屬性的類型
  • AppStorageV2:應用全局UI狀態存儲,對應v1的AppStorage
  • PersistenceV2:持久化儲存UI狀態,對應v1的PersistentStorage
  • !!語法:雙向綁定,
  • Repeat:子組件復用
  • getTarget接口:獲取狀態管理框架代理前的原始對象
  • makeObserved接口:將非觀察數據變為可觀察數據

@ObservedV2 和 @Trace

@ObservedV2和@Trace提供了對嵌套類對象屬性變化直接觀測的能力,是狀態管理V2中相對核心的能力之一。

狀態管理V1版本對嵌套類對象屬性變化直接觀測的局限性

@Track使class具有屬性級更新的能力,但并不具備深度觀測的能力;而@State只能觀測到對象本身以及第一層的變化,對于多層嵌套場景只能通過封裝自定義組件,搭配@Observed和@ObjectLink來實現觀測。

ObservedV2 和 Trace 使用場景

嵌套類或繼承類中使用,用于裝飾類以及類中的屬性,使得被裝飾的類和屬性具有深度觀測的能力

@Local

  • 被@Local裝飾的變量無法從外部初始化,因此必須在組件內部進行初始化。
  • 當被@Local裝飾的變量變化時,會刷新使用該變量的組件。
  • @Local的觀測能力僅限于被裝飾的變量本身。

狀態管理V1版本@State裝飾器的局限性

在V1中,由于@State裝飾器能夠從外部初始化,因此@State無法準確表達組件內部狀態不能被外面修改的語義。

@Param

  • @Param不僅可以接受組件外部輸入,還可以接受@Local的同步變化。
  • 允許本地初始化,若不在本地初始化,則需要和@Require裝飾器一起使用,要求必須從外部傳入初始化。
  • @Param裝飾的變量在子組件中無法進行修改。但當裝飾的變量類型為對象時,在子組件中修改對象中屬性是允許的。

狀態管理V1版本接受外部傳入的裝飾器的局限性

  • 狀態管理V1存在多種可接受外部傳入的裝飾器,常用的有@State、@Prop、@Link、@ObjectLink。
  • @Prop雖然能夠進行單向同步,但是對于較復雜的類型來說,深拷貝性能較差。
  • @Link能夠接受傳入的引用進行雙向同步,但它必須要求數據源也是狀態變量,因此無法接受info中的成員屬性region。
  • @ObjectLink能夠接受類成員屬性,但是要求該屬性類型必須為@Observed裝飾的類。裝飾器的不同限制使得父子組件之間傳值規則十分復雜,不易使用。

@Once

  • @Once必須搭配@Param使用,單獨使用或搭配其他裝飾器使用都是不允許的。
  • @Once不影響@Param的觀測能力,僅針對數據源的變化做攔截。
  • @Once與@Param搭配使用時,可以在本地修改@Param變量的值。

@Event

  • 由于@Param裝飾的變量在本地無法更改,使用@Event裝飾器裝飾回調方法并調用,可以實現更改數據源的變量,再通過@Local的同步機制,將修改同步回@Param,以此達到主動更新@Param裝飾變量的效果。
  • @Param標志著組件的輸入,表明該變量受父組件影響,而@Event標志著組件的輸出,可以通過該方法影響父組件。使用@Event裝飾回調方法是一種規范,表明該回調作為自定義組件的輸出。父組件需要判斷是否提供對應方法用于子組件更改@Param變量的數據源。

@Computed

  • 計算屬性,在被計算的值變化的時候,只會計算一次。主要應用于解決UI多次重用該屬性從而重復計算導致的性能問題。
  • @Computed為方法裝飾器,裝飾getter方法。

Computed 使用場景

  • 當被計算的屬性變化時,@Computed裝飾的getter訪問器只會被求解一次(但有性能開銷)
  • @Computed裝飾的屬性可以被@Monitor監聽變化
  • @Computed裝飾的屬性可以初始化@Param

@Type

標記類屬性,配合PersistenceV2使用,防止序列化時類丟失。

PersistenceV2

  • 對于與PersistenceV2關聯的@ObservedV2對象,該對象的@Trace屬性的變化,會觸發整個關聯對象的自動持久化;
  • PersistenceV2可以和UI組件同步,且可以在應用業務邏輯中被訪問。
  • PersistenceV2支持應用的主線程內多個UIAbility實例間的狀態共享。
  • 開發者可以通過connect綁定同一個key,在狀態變量變換和應用冷啟動時,實現持久化能力。

AppStorageV2

  • AppStorageV2可以和UI組件同步,且可以在應用業務邏輯中被訪問。
  • AppStorageV2支持應用的主線程內多個UIAbility實例間的狀態共享。
  • AppStorageV2是提供狀態變量在應用級全局共享的能力,開發者可以通過connect綁定同一個key,進行跨ability的數據共享。

!!語法

  • !!雙向綁定語法,是一個語法糖方便開發者實現數據雙向綁定,
  • 用于初始化子組件的@Param和@Event。其中@Event方法名需要聲明為“$”+ @Param屬性名

示例:

@Entry
@ComponentV2
struct Index {@Local value: number = 0;build() {Column() {Text(`${this.value}`)Button(`change value`).onClick(() => {this.value++;})Star({ value: this.value!! })}}
}@ComponentV2
struct Star {@Param value: number = 0;@Event $value: (val: number) => void = (val: number) => {};build() {Column() {Text(`${this.value}`)Button(`change value `).onClick(() => {this.$value(10);})}}
}

Repeat

  • on-virtualScroll場景中,需要與容器組件配合使用,例如,ListItem組件要求Repeat的父容器組件必須為List組件。
  • 與ForEach相比,一是:優化了渲染性能,二是:index由框架側來維護。
  • virtualScroll場景中,新增了 按需創建組件緩存組件

getTarget

  • 使用getTarget接口需要導入UIUtils工具。
  • 狀態管理V2中,會給使用狀態變量裝飾器如@Trace、@Local裝飾的Date、Map、Set、Array添加一層代理用于觀測API調用產生的變化。
  • 使用getTarget接口可以獲取這些代理對象的原始對象

makeObserved

  • class的定義在三方包中:開發者無法手動對class中需要觀察的屬性加上@Trace標簽,可以使用makeObserved使得當前對象可以被觀察。
  • 當前類的成員屬性不能被修改:因為@Trace觀察類屬性會動態修改類的屬性,這個行為在@Sendable裝飾的class中是不被允許的,此時可以使用makeObserved。
  • interface或者JSON.parse返回的匿名對象:這類場景往往沒有明確的class聲明,開發者無法使用@Trace標記當前屬性可以被觀察,此時可以使用makeObserved。

參考資料:狀態管理(V2)

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

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

相關文章

Git中revert和reset區別?

git revert 和 git reset 都用于撤銷 Git 中的提交,但它們的作用和使用場景不同: git revert: 作用:創建一個新的提交,撤銷指定的提交內容。使用場景:用于“回滾”已推送到遠程倉庫的提交。這種方法不會改變提交歷史&a…

LabVIEW開發中的電機控制與相機像素差

在電機控制系統中,我們需要精確控制電機運動與相機拍攝畫面之間的關系。理想情況下,當電機帶動相機移動同樣的距離時,相機拍攝畫面中兩點之間的像素差應當是一個固定值。然而,在實際應用中,我們發現這一像素差并非固定…

從零到一:構建現代 React 應用的完整指南

1. create-react-app (CRA) 簡介: create-react-app 是官方推薦的 React 項目腳手架工具,提供了一個開箱即用的開發環境,幫助開發者快速啟動 React 應用。它會自動配置 Webpack、Babel、ESLint 等工具,讓你專注于開發而不需要手動配置工具鏈。 特點: 零配置:CRA 自動配…

rman 備份恢復1

前提: rman用戶必須具有sysdba權限 使用常用連接方式如下: rman target / rman target sys/oracle rman target sys/oracleprod1 catalog dav/oracledav_db 一個rman連接會產生兩個進程,action字段為空的就是rman的監控進程,另…

Qt程序退出相關資源釋放問題

目錄 問題背景: aboutToQuit 代碼舉例 closeEvent事件 代碼舉例 程序退出方式 quit() exit(int returnCode 0) close() 問題背景: 實際項目中程序退出前往往需要及進行一些資源釋放、配置保存、線程中斷等操作,避免資源浪費&#xff…

【DeepSeek】Mac m1電腦部署DeepSeek

一、電腦配置 個人電腦配置 二、安裝ollama 簡介:Ollama 是一個強大的開源框架,是一個為本地運行大型語言模型而設計的工具,它幫助用戶快速在本地運行大模型,通過簡單的安裝指令,可以讓用戶執行一條命令就在本地運…

[生活雜項][運動教程]自由泳

https://v.youku.com/v_show/id_XMzgzMjkwMzg0MA.html?spma2h0k.11417342.soresults.dtitle https://v.youku.com/v_show/id_XMzgxNjM2NjY4NA.html?spma2h0k.11417342.soresults.dtitle

Linux的指令與熱鍵

一.指令 1.pwd :顯示一個用戶當前所處的目錄 2.ls :顯示當前目錄下的文件(顯示當前文件屬性) ls -l :顯示當前目錄下文件的屬性及更多內容(ll是ls -l的別名,用法相同) ls -l 目錄:顯示指定目錄內容 ls…

【Dubbo+Zookeeper】——SpringBoot+Dubbo+Zookeeper知識整合

🎼個人主頁:【Y小夜】 😎作者簡介:一位雙非學校的大二學生,編程愛好者, 專注于基礎和實戰分享,歡迎私信咨詢! 🎆入門專欄:🎇【MySQL&#xff0…

【OS安裝與使用】part5-ubuntu22.04基于conda安裝pytorch+tensorflow

文章目錄 一、待解決問題1.1 問題描述1.2 解決方法 二、方法詳述2.1 必要說明2.2 應用步驟2.2.1 明確pytorch安裝依賴2.2.2 conda創建虛擬環境2.2.3 安裝pytorch2.2.4 驗證pytorch安裝2.2.5 安裝Tensorflow2.2.6 驗證Tensorflow安裝 三、疑問四、總結 一、待解決問題 1.1 問題…

馬拉車算法

Manacher算法 ,用于處理最長回文字符串的問題,可以在O(n)的情況下,求出一個字符串的最長回文字符串 回文串的基礎解法: 以每個點為中心對稱點,看左右兩邊的點是否相同。這種算法的時間復雜度為O&#xff0…

氣象學中的CDO插值(多方法+多分辨率)

文章目錄 說明CDO代碼 說明 需要新建.sh腳本文件,將下面的CDO代碼復制到.sh腳本中,然后運行插值程序。 CDO代碼 #!/bin/bash # # 用戶配置區(按實際需求修改) # input_directory"2m_temperature" # 自定義路徑 gr…

計算機網絡:應用層 —— 動態主機配置協議 DHCP

文章目錄 什么是 DHCP?DHCP 的產生背景DHCP 的工作過程工作流程地址分配機制 DHCP 中繼代理總結 什么是 DHCP? 動態主機配置協議(DHCP,Dynamic Host Configuration Protocol)是一種網絡管理協議,用于自動分…

【OS安裝與使用】part3-ubuntu安裝Nvidia顯卡驅動+CUDA 12.4

文章目錄 一、待解決問題1.1 問題描述1.2 解決方法 二、方法詳述2.1 必要說明2.2 應用步驟2.2.1 更改鏡像源2.2.2 安裝NVIDIA顯卡驅動:nvidia-550(1)查詢顯卡ID(2)PCI ID Repository查詢顯卡型號(3&#xf…

數據導入AI訓練步驟——人工智能訓練

一、人工操作轉化 數據導入過程 整理excel表格,通過數據庫管理工具導入數據,補充數據格式,調整sql語句 復制數據到目標數據 二、整理表格 三、導入數據 通過數據庫導入數據 四、合并 五、驗證更新數據 六、 更新數據 update temp_cus_hmz…

我國首條大型無人機城際低空物流航線成功首航

首航震撼開場:羊肉 “飛” 越 540 公里 在夜色的籠罩下,榆陽馬合通用機場的跑道上,一架大型固定翼無人機蓄勢待發,機身被燈光照亮,宛如一只即將展翅翱翔的鋼鐵巨鳥。它的貨艙里,滿滿裝載著新鮮的榆林羊肉&a…

《跟李沐學 AI》AlexNet論文逐段精讀學習心得 | PyTorch 深度學習實戰

前一篇文章,使用 AlexNet 實現圖片分類 | PyTorch 深度學習實戰 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章內容來自于學習 9年后重讀深度學習奠基作之一:AlexNet【下】【論文精讀】】的心得。 《跟李沐…

微軟Win11新動態:官方“換機助手”曝光,PC數據遷移或迎全新體驗

目錄 微軟入局數據遷移領域,第三方工具或面臨挑戰 無縫遷移體驗:近距離傳輸與OTP驗證 模擬圖僅為概念設計,最終功能或存變數 發布時間未定,Insider用戶或率先體驗 總結 微軟在近期發布了Windows 11 Insider Beta頻道的最新版本Build 22635.4945。盡管此次更新并未引入重…

Could not initialize class io.netty.util.internal.Platfor...

異常信息: Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class io.netty.util.internal.PlatformDependent0 Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.reflect.InaccessibleObjec…

java練習(34)

ps:題目來自力扣 尋找兩個正序數組的中位數 給定兩個大小分別為 m 和 n 的正序(從小到大)數組 nums1 和 nums2。請你找出并返回這兩個正序數組的 中位數 。 算法的時間復雜度應該為 O(log (mn)) 。 class Solution {public double findMedianSortedA…