優雅的@ObservedV2和@Trace裝飾器

Hello,大家好,我是 V 哥。在HarmonyOS NEXT開發中,@ObservedV2裝飾器和@Trace裝飾器是用于狀態管理的兩個裝飾器,它們在HarmonyOS應用開發中用于增強對類對象中屬性的觀測能力。如果你學過觀察者模式的原理,你會更容易理解和上手,以下是它們的一些關鍵特性和使用注意事項:

@ObservedV2和@Trace裝飾器的關鍵特性

@ObservedV2裝飾器

  • 需要放在類的定義前,使用new創建類對象。
  • 單獨使用@ObservedV2裝飾器沒有任何作用,需要與@Trace裝飾器配合使用。
  • 在嵌套類中,嵌套類中的屬性被@Trace裝飾且嵌套類被@ObservedV2裝飾時,才具有觸發UI刷新的能力。
  • 在繼承類中,父類或子類中的屬性被@Trace裝飾且該屬性所在類被@ObservedV2裝飾時,才具有觸發UI刷新的能力。
  • 未被@Trace裝飾的屬性用在UI中無法感知到變化,也無法觸發UI刷新。
  • @ObservedV2的類實例目前不支持使用JSON.stringify進行序列化。

@Trace裝飾器

  • 用于裝飾被@ObservedV2裝飾的class中的屬性,使得屬性具有深度觀測的能力。
  • 可以裝飾的變量類型包括numberstringbooleanclassArrayDateMapSet等類型。
  • 被@Trace裝飾器裝飾的屬性變化時,僅會通知屬性關聯的組件進行刷新。
使用注意事項
  • 要監聽的屬性要添加@Trace裝飾器。
  • 被監聽的屬性所在的類要添加@ObservedV2。
  • 繼承類中,繼承其中的被監聽的屬性時,可以等價視為是給出自己的類添加了@Trace裝飾器監聽。
  • @ObservedV2的類實例目前不支持使用JSON.stringify進行序列化,至于原因是啥,V哥在文末解釋。
  • 繼承自@ObservedV2的類無法和@State等V1的裝飾器混用,運行時報錯。

業務場景代碼案例

假設我們有一個電商應用,需要展示商品的名稱和價格,并且當價格更新時,界面能夠響應變化。

// 商品類,被@ObservedV2裝飾,表示這是一個需要被觀測的類
@ObservedV2
class Product {// 商品名稱,被@Trace裝飾,表示這個屬性的變化需要被觀測@Trace name: string;// 商品價格,被@Trace裝飾,表示這個屬性的變化需要被觀測@Trace price: number;constructor(name: string, price: number) {this.name = name;this.price = price;}
}// 組件類,用于展示商品信息
@ComponentV2
struct ProductComponent {// 商品實例,使用@Local裝飾,表示這是一個局部狀態@Local product: Product = new Product("V哥小炒肉", 100);build() {Column() {Text(`Name: ${this.product.name}`).fontSize(30).fontWeight(FontWeight.Bold);Text(`Price: ¥${this.product.price}`).fontSize(30).fontWeight(FontWeight.Bold);Button("更新價格").onClick(() => {// 更新商品價格,由于price被@Trace裝飾,UI將響應這一變化this.product.price += 10;});}.width('100%').height('100%');}
}// 入口函數,啟動應用
@Entry
@ComponentV2
struct Index {build() {Row() {ProductComponent();}}
}

在這個例子中,Product類被@ObservedV2裝飾,表示這是一個需要被觀測的類。nameprice屬性被@Trace裝飾,表示這些屬性的變化需要被觀測。在ProductComponent組件中,我們創建了一個Product實例,并在UI中展示它的nameprice。當用戶點擊按鈕時,price屬性的值增加,由于它被@Trace裝飾,UI將自動響應這一變化并刷新顯示新的價格。

優勢

  • 相比V1版本,V2版本提供了更強大的狀態管理能力,包括深度觀測和深度監聽,以及更靈活的裝飾器使用。
  • V2版本增強了觀測性能和裝飾器的易用性,更有利于組件化開發。

所以建議在開發中使用 V2版本。

為什么@ObservedV2不支持JSON.stringify?

@ObservedV2不支持JSON.stringify的原因主要有兩個方面:

  1. 復雜數據結構和監聽器:HarmonyOS的@ObservedV2類實例設計用于響應式編程,通常用于UI框架中的數據綁定。其內部可能包含復雜的數據結構和監聽器,這些都不適合直接通過JSON.stringify進行序列化。JSON.stringify主要用于處理簡單數據結構,如對象、數組、字符串等,而復雜對象(如包含函數、循環引用或特定類實例)可能無法正確序列化。

  2. 序列化后會有__ob_前綴的問題:被@ObservedV2標記的類及字段,使用JSON.stringify之后字段名稱都加上了“__ob_”開頭的字段,導致無法反序列化回來。這是因為@ObservedV2裝飾器在類實例上添加了一些內部屬性和方法來實現響應式功能,這些屬性和方法在序列化時會產生問題。

針對@ObservedV2對象,建議通過手動提取需要序列化的數據字段,或者自定義序列化邏輯來轉換數據。如果問題依舊沒法解決,可能需要考慮其他的數據傳遞或存儲方案。

最后

這些裝飾器的引入,使得HarmonyOS應用開發中的狀態管理更加靈活和強大,尤其是在處理復雜對象和深層次屬性變化時,提供了更好的解決方案。關注威哥愛編程,一起鴻蒙起來。鴻蒙你我他,生態靠大家。

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

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

相關文章

備戰藍橋第一天 驗證回文串 楊輝三角

LCR 018. 驗證回文串 - 力扣(LeetCode) 涉及的函數: int isalnum ( int c ); 檢查字符是否為字母數字 int tolower ( int c ); 將大寫字母轉換為小寫 void reverse (BidirectionalIterator first, BidirectionalIterator last); 反轉區域中…

【實戰】提升List性能方法有幾何

在內存中的 List<T> 上使用 LINQ 查詢時&#xff0c;加索引并不像數據庫那樣有內置支持&#xff0c;但可以通過以下方式提高查詢性能&#xff1a; 1. 手動構建索引 可以手動構建一個字典 (Dictionary<TKey, TValue>)&#xff0c;將需要查詢的字段作為鍵&#xff0…

一款免費、簡單、快速的JS打印插件,web 打印組件,基于JavaScript開發,支持數據分組,快速分頁批量預覽,打印,轉pdf,移動端,PC端

前言 在數字化辦公時代&#xff0c;打印需求呈現多樣化和復雜化的趨勢。現有的打印軟件往往存在cao作繁瑣、兼容性差、功能單一等問題&#xff0c;難以滿足現代企業高效、靈活的打印需求。 為了解決這些痛點&#xff0c;一款簡單、高效、多功能的打印插件成為了迫切需求。 介…

Python pywin32庫詳解

一、引言 在Python編程中&#xff0c;有時候需要與Windows操作系統進行交互&#xff0c;執行一些特定的系統操作或操作 Windows 應用程序。這時&#xff0c;pywin32庫就成為了一個非常強大的工具。pywin32庫提供了對Windows API的訪問&#xff0c;使得Python開發者能夠在Windo…

Uniapp的vue、nvue、uvue后綴名區別

在 UniApp 中&#xff0c;.vue、.nvue 和 .uvue 是不同的文件后綴名&#xff0c;每個文件格式的使用場景和兼容性略有不同。下面是每個文件后綴的詳細解釋以及它們的兼容性&#xff1a; 1. .vue 文件 定義&#xff1a;.vue 是標準的 Vue 單文件組件格式&#xff0c;主要用于基…

TCP/IP雜記

TCP三次握手、四次揮手 從應用角度&#xff0c;不用多考慮為什么有三次&#xff0c;遵循標準即可。 ubuntu 下 wireshark安裝&#xff1a; sudo add-apt-repository universe sudo apt install wireshark 三次握手實證&#xff1a; 第一次握手的情況如下&#xff1a;&#…

Vue前端開發-接收跳轉參數

路由攜帶參數跳轉到目標頁面后&#xff0c;頁面組件可以接收到攜帶傳入的參數&#xff0c;接收的方式與攜帶的方式相關&#xff0c;如果是采用查詢字符串方式攜帶&#xff0c;那么可以通過路由中的query對象獲取到參數&#xff0c;如果是其他方式&#xff0c;通常都是通過路由中…

力扣--LCR 177.撞色搭配

題目 整數數組 sockets 記錄了一個襪子禮盒的顏色分布情況&#xff0c;其中 sockets[i] 表示該襪子的顏色編號。禮盒中除了一款撞色搭配的襪子&#xff0c;每種顏色的襪子均有兩只。請設計一個程序&#xff0c;在時間復雜度 O(n)&#xff0c;空間復雜度O(1) 內找到這雙撞色搭配…

[ComfyUI]批量生成圖片的節點:輸入一個prompt列表批量生成圖像

文章目錄 1.參考資料2.兩個節點的部署FizzNodes節點comfyui-mixlab-nodes 生成的結果展示 1.參考資料 如何使用ComfyUI一次批量生成不同內容的圖片 ComfyUI工作流】隨機提示詞批量出圖&#xff0c;懶人刷圖福音&#xff0c;根據提示 2.兩個節點的部署 FizzNodes節點 fizzn…

【實操GPT-SoVits】聲音克隆模型圖文版教程

項目github地址&#xff1a;https://github.com/RVC-Boss/GPT-SoVITS.git官方教程&#xff1a;https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/tkemqe8vzhadfpeu本文旨在迅速實操GPT-SoVits項目&#xff0c;不闡述技術原理&#xff08;后期如果有時間研究&#…

5G模組AT命令腳本-關閉模組的IP過濾功能

關閉模組的IP過濾功能 關閉模組的IP過濾功能 5G 模組通常使用nat方式為 下掛設備或上位機提供上網服務&#xff0c;默認情況&#xff0c;不做NAt的包無法經由 模組轉發&#xff0c;如果禁掉這個限制 &#xff0c;可使用本文中的配置命令本腳本用于關閉模組的IP過濾功能&#xf…

JAVA (Springboot) i18n國際化語言配置

JAVA i18n國際化語言配置 一、簡介二、功能三、Java配置國際化步驟四、Java國際化配置工具類五、Spring Boot配置六、測試 一、簡介 在Java中&#xff0c;國際化&#xff08;Internationalization&#xff0c;通常簡稱為i18n&#xff09;是一個過程&#xff0c;它允許應用程…

如何創建基于udp的客戶端和服務端

1.先創建好udpServer.hpp、udpServer.cc、udpClient.hpp、udpClient.cc的框架。 #pragma once #include <string> #include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <cerrno> #include…

【上線文檔】系統上線方案模板,計算機系統上線保障計劃,系統運維信息系統運行保障方案,系統上線方案模板(Word原件)

一、項目背景和目標 二、項目需求分析 2.1 功能需求 2.2 非功能需求 三、系統設計 3.1 系統架構設計 3.2 數據庫設計 3.3 接口設計 3.4 用戶界面設計 四、系統開發 4.1 開發環境搭建 4.2 業務邏輯開發 4.3 數據庫實現 4.4 接口實現 4.5 用戶界面實現 五、系統測…

大模型應用的數字能源數據集

除了尚須時日的量子計算解決算力效率和能源問題&#xff0c;以及正在路上的超越transformer的全新模型架構外&#xff0c;無疑是“數據集”&#xff0c;準確講是“高質量大規模多樣性的數據集”。數據集是大模型發展的核心要素之一&#xff0c;是大計算的標的物&#xff0c;是實…

【OpenCV】圖像轉換

理論 傅立葉變換用于分析各種濾波器的頻率特性。對于圖像&#xff0c;使用 2D離散傅里葉變換&#xff08;DFT&#xff09; 查找頻域。快速算法稱為 快速傅立葉變換&#xff08;FFT&#xff09; 用于計算DFT。 Numpy中的傅立葉變換 首先&#xff0c;我們將看到如何使用Numpy查…

如何使用Java編寫Jmeter函數

Jmeter 自帶有各種功能豐富的函數&#xff0c;可以幫助我們進行測試&#xff0c;但有時候提供的這些函數并不能滿足我們的要求&#xff0c;這時候就需要我們自己來編寫一個自定義的函數了。例如我們在測試時&#xff0c;有時候需要填入當前的時間&#xff0c;雖然我們可以使用p…

【2024版】最新kali linux入門及常用簡單工具介紹(非常詳細)從零基礎入門到精通,看完這一篇就夠了

前言 相信很多同學了解到和學習網絡安全的時候都聽過kali系統&#xff0c;大家都稱之為黑客最喜愛的系統&#xff0c;那么什么是kali&#xff0c;初學者用kali能做些什么&#xff0c;大白我將在本文中做詳細的介紹&#xff1a; 一、kali linux是什么&#xff1f; Kali Linux…

使用 electron 把 vue 項目打包成客戶端

1. 新建一個Vue項目 新建一個vue項目&#xff0c;或者在已經寫好的vue項目上操作 2. 安裝依賴包 需要安裝的包有2個 electron electron-builder 安裝失敗的&#xff0c;可看另外一篇解決方法https://blog.csdn.net/Anorry/article/details/144061069?spm1001.2014.3001.5501 3…

六大排序算法:插入排序、希爾排序、選擇排序、冒泡排序、堆排序、快速排序

本章講述數據結構中的六大排序算法 歡迎大佬們踴躍討論&#xff0c;感謝大家支持&#xff01; 我的博客主頁鏈接 六大排序算法 一.插入排序1.1 直接插入排序1.2 希爾排序 二.選擇排序2.1 單向選擇排序2.2雙向選擇排序2.3 堆排序 三.交換排序3.1 冒泡排序3.2 快速排序3.2.1 Hoa…