HarmonyOS 實戰:用 @Observed + @ObjectLink 玩轉多組件實時數據更新

在這里插入圖片描述

摘要

在鴻蒙(HarmonyOS)應用開發中,實時數據更新是一個繞不開的話題,尤其是在你封裝了很多自定義組件、需要多個組件之間共享和同步數據的場景里。過去我們可能會依賴父子組件直接傳參或全局狀態管理,但這樣寫會讓代碼變得復雜、不易維護。鴻蒙提供了 @Observed@ObjectLink 裝飾器,幫我們優雅地實現數據的實時更新和組件聯動,開發體驗非常順滑。

引言

現在的鴻蒙應用場景越來越復雜,比如電商的商品詳情和購物車同步、聊天應用的實時消息刷新、IoT 應用中的設備狀態變更。這些都要求數據能在不同組件間實時更新,而且不能為了同步狀態寫一堆“搬運代碼”。

在日常開發中,@Observed 負責讓一個類的實例具備“可觀察”的能力,一旦數據變化,引用它的組件就會自動刷新。@ObjectLink 則讓子組件能夠直接“訂閱”父組件傳下來的對象變化,而不需要手動再寫回調去同步。

下面我們通過一個可運行的 Demo,把這套機制講清楚。

用 @Observed + @ObjectLink 實現實時數據更新

基本原理

  • @Observed:讓一個類的實例變成可觀察對象,當它的屬性發生變化時,會通知引用它的 UI 組件重新渲染。
  • @ObjectLink:用于子組件屬性綁定,讓子組件可以感知父組件傳入的對象變化。

代碼示例

// ViewModel.ts
@Observed
export class MyViewModel {title: string = ""constructor(title: string) {this.title = title}
}// OtherComponent.ets
@Component
export struct OtherComponent {@ObjectLink vm: MyViewModelbuild() {Row() {Text(this.vm.title).fontSize(20).fontWeight(FontWeight.Bold).margin(10)}.width("100%").height(60).backgroundColor("#eeeeee").justifyContent(FlexAlign.Center).alignItems(VerticalAlign.Center)}
}// MyComponent.ets
@Entry
@Component
export struct MyComponent {@State vm: MyViewModel = new MyViewModel("初始標題")build() {Column() {OtherComponent({ vm: this.vm }).onClick(() => {this.vm.title = "標題已更新 " + new Date().toLocaleTimeString()})Button("點擊更新標題").margin(10).onClick(() => {this.vm.title = "按鈕觸發更新 " + new Date().toLocaleTimeString()})}.width("100%").height("100%")}
}

代碼解析

MyViewModel

  • @Observed 修飾,讓它的屬性具備響應式更新能力。
  • 改變 title 會自動觸發 UI 組件刷新。

OtherComponent

  • @ObjectLink 接收父組件傳入的 vm,并實時訂閱它的變化。
  • 不需要手動寫事件監聽,只要數據變化,UI 就會刷新。

MyComponent

  • @State 聲明一個可響應的 MyViewModel 實例,并傳給子組件。
  • 父組件點擊區域或者按鈕都會修改 vm.title,從而觸發子組件刷新。

場景應用

場景 1:商品詳情與購物車同步

描述:在電商應用中,用戶在商品詳情頁修改購買數量,購物車組件的數量顯示也需要立刻變化。

實現思路

  • 將商品數量信息放到一個 @Observed 的 ViewModel 中。
  • 詳情頁和購物車組件通過 @ObjectLink 共享這個 ViewModel。
@Observed
export class CartItem {count: number = 1
}@Component
export struct ProductDetail {@ObjectLink item: CartItembuild() {Column() {Button("增加數量").onClick(() => this.item.count++)}}
}@Component
export struct CartBar {@ObjectLink item: CartItembuild() {Text("數量: " + this.item.count)}
}

場景 2:聊天應用的實時消息

描述:在聊天頁面發送消息,消息列表組件應當實時刷新。

實現思路

  • @Observed 包裝一個 MessageList,內部是一個數組。
  • 消息輸入框組件發送消息后,直接修改 MessageList,消息列表組件自動更新。
@Observed
class MessageList {messages: string[] = []
}@Component
struct ChatInput {@ObjectLink msgList: MessageListbuild() {Button("發送").onClick(() => {this.msgList.messages.push("新消息 " + Date.now())})}
}@Component
struct ChatList {@ObjectLink msgList: MessageListbuild() {Column() {ForEach(this.msgList.messages, (msg) => Text(msg))}}
}

場景 3:IoT 設備狀態面板

描述:多個組件顯示同一設備的溫度、濕度、電池電量,任意組件更新數據時其他組件同步變化。

實現思路

  • @Observed 包裝 DeviceStatus 對象。
  • 傳遞給各個子組件,通過 @ObjectLink 綁定。

QA 環節

Q1:@Observed 和 @State 有什么區別?

  • @Observed 用于類的實例,使它變成可觀察對象,適合跨組件共享。
  • @State 用于組件內的變量,適合管理本地狀態。

Q2:為什么要用 @ObjectLink,而不是直接傳值?

  • 直接傳值是淺拷貝,不會觸發子組件刷新。
  • @ObjectLink 會建立對象引用,保證數據變化實時傳遞。

Q3:如果多個組件要共享數據,該怎么組織?

  • 建議抽一個 ViewModel,用 @Observed 修飾,在需要的地方通過 @ObjectLink 引用。

總結

在鴻蒙應用開發中,@Observed + @ObjectLink 是處理實時數據更新的“黃金搭檔”。它們的組合能讓我們輕松在多個組件間同步數據,而不用手動寫一堆事件監聽或狀態同步邏輯。在實際項目中,不管是電商、聊天還是 IoT 應用,這套模式都能極大減少代碼量,提高可維護性。

如果你現在的項目中有多個自定義組件需要共享數據,這套方法可以直接用起來,幾乎不需要額外改動架構。

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

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

相關文章

云原生俱樂部-雜談2

說實話,雜談系列可能會比較少,因為畢竟大部分時間都是上的線上,迄今為止也是,和雷老師與WH的交流不是很多。這個系列僅僅是我在做其他筆記部分無聊的時候來寫的,內容也沒有規劃過,隨想隨寫。倒不是時間太多…

波浪模型SWAN學習(1)——模型編譯與波浪折射模擬(Test of the refraction formulation)

SWAN模型編譯與波浪折射模擬(Test of the refraction formulation)編譯過程算例簡介參數文件文件頭(HEADING)計算區域和網格地形數據邊界條件物理模塊設置輸出設置執行參數模擬結果由于工作原因,最近開始接觸波浪模型&…

更換cmd背景圖片

打開cmd 右擊頂部,選擇設置選擇命令提示符,外觀選擇背景圖像路徑更改成自己的圖片,然后右下角保存 設置成功

基于RobustVideoMatting(RVM)進行視頻人像分割(torch、onnx版本)

發表時間:2021年8月25日 項目地址:https://peterl1n.github.io/RobustVideoMatting/ 論文閱讀:https://hpg123.blog.csdn.net/article/details/134409222 RVM是字節團隊開源的一個實時人像分割模型,基于LSTMConv實現,…

強制從不抱怨環境。

警世俗語:強者逆襲心法(句句穿心)環境是泥潭?那就讓它開出金蓮! —— 抱怨是弱者的裹腳布,行動是強者的登天梯。爛泥里也能種出搖錢樹,關鍵看你敢不敢下手挖!老天爺發牌爛&#xff1…

MC0439符號統計

碼蹄集OJ-符號統計 MC0439?符號統計 難度:黃金 時間限制:1 秒 占用內存:256 M 收藏 報錯 在華容道放曹的緊張時刻,小碼哥接到了一個看似微不足道卻至關重要的任務:解讀一條僅由小寫英文字母組成的神秘字符串 s&#…

Android Jetpack 系列(五)Room 本地數據庫實戰詳解

1. 簡介 在需要輕量級本地持久化的場景中,DataStore 是一個理想的選擇(詳見《Android Jetpack 系列(四)DataStore 全面解析與實踐》)。但當你面臨如下需求時,本地數據庫便顯得尤為重要: 復雜的…

C語言實現類似C#的格式化輸出

在C#中,格式化輸出可以使用索引占位符以及復合格式的占位符,可以不用關心后面參數是什么類型,使用起來非常方便,如下簡單的示例: Console.WriteLine("{2} {1} {0} {{{2}}}", "Hello, World!", 1,…

一人公司方法論

** 一人公司方法論 ** 那什么是一人公司? 字面的理解就是一個人運營的公司,但實際上它指代的是比較少的人運營的小公司,一般來說 1 ~ 3 個人運營的公司,也可以把它放到一人公司的范圍以內。其他一些形式,比如說一個人再…

Ceph CSI 鏡像刪除流程與 Trash 機制失效問題分析文檔

#作者:閆乾苓 文章目錄一、問題背景二、實際行為三、源碼分析四、分析與推論五、期望行為與建議優化六、結論一、問題背景 在生產環境中,為避免因誤操作導致的永久數據丟失,Ceph RBD 提供了 Trash 功能,允許將鏡像“軟刪除”至回…

.NET Framework 3.5 不原生支持PreApplicationStartMethod特性

.NET Framework 3.5 不原生支持PreApplicationStartMethod特性。這個特性是在 .NET Framework 4.0 中引入的,用于在應用程序啟動早期執行初始化邏輯。 在.NET 3.5 中,如果你需要實現類似的 “應用啟動時自動注冊模塊” 功能,需要通過手動配置…

智能巡檢技術淺析

從機載智能硬件到深度學習算法,從實時邊緣計算到數字孿生平臺,無人機AI智能巡檢通過多模態感知、自主決策和持續進化,實現從"被動檢查"到"主動預防"的跨越式發展。機載智能硬件邊緣計算與機載AI芯片當代先進巡檢無人機已…

【圖像算法 - 11】基于深度學習 YOLO 與 ByteTrack 的目標檢測與多目標跟蹤系統(系統設計 + 算法實現 + 代碼詳解 + 擴展調優)

前言 詳細視頻介紹 【圖像算法 - 11】基于深度學習 YOLO 與 ByteTrack 的目標檢測與多目標跟蹤系統(系統設計 算法實現 代碼詳解 擴展調優)在計算機視覺應用中,目標檢測與多目標跟蹤的結合是實現智能視頻分析的關鍵。本文基于 YOLO 檢測模…

AI加持下的智能路由監控:Amazon VPC Direct Connect實戰指南

> 一次流量突增引發的生產事故,如何催生出融合流日志、機器學習與自動化告警的智能監控體系 深夜2點,電商平臺運維負責人李明的手機瘋狂報警——北美用戶下單量斷崖式下跌。他緊急登錄系統,發現跨境專線延遲飆升至2000ms。**經過3小時的排查**,罪魁禍首竟是新部署的CDN…

具身智能競速時刻,百度百舸提供全棧加速方案

2025年,全球具身智能賽道迎來快速發展期,技術方向日益清晰。每一家企業都面臨著同樣的核心命題:如何將前沿的模型能力,轉化為在真實世界各類場景中可規模化應用落地的機器人產品?這背后,是研發團隊對模型迭…

JavaScript 壓縮與混淆實戰:Terser 命令行詳解

使用 Terser 壓縮 JavaScript 文件(基礎 現代語法問題解決) 在前端開發中,隨著業務復雜度增加,JavaScript 文件體積越來越大。 文件大帶來的問題: 加載慢:文件越大,瀏覽器下載和解析時間越長…

【數據結構初階】--排序(三):冒泡排序、快速排序

😘個人主頁:Cx330? 👀個人簡介:一個正在努力奮斗逆天改命的二本覺悟生 📖個人專欄:《C語言》《LeetCode刷題集》《數據結構-初階》 前言:在上篇博客的學習中,我們掌握了直接選擇排序…

名詞概念:什么是尾部誤差?

“尾部誤差”就是指誤差分布在兩端的那一小撮、但數值特別大的誤差——也就是離中心(均值/中位數)很遠的“極端樣本”的誤差。對應統計學里的“分布尾部”(tails)。通俗點:大多數樣本誤差都很小,但總會有少…

記對外國某服務器的內網滲透

本專欄是筆者的網絡安全學習筆記,一面分享,同時作為筆記 文章目錄前文鏈接前言上線CS上線rdp后滲透信息收集SMB Pth攻擊權限維持魔幻上線提權關Windows Defenderend前文鏈接 WAMP/DVWA/sqli-labs 搭建burpsuite工具抓包及Intruder暴力破解的使用目錄掃描…

速賣通平臺關鍵字搜索商品列表列表接口實現指南:從接口分析到代碼落地

在跨境電商開發中,速賣通平臺的商品數據獲取是許多開發者關注的焦點。本文將詳細介紹如何實現速賣通關鍵字搜索商品列表接口,涵蓋接口請求參數分析、簽名機制、分頁處理及完整代碼實現,幫助開發者快速對接速賣通開放平臺。一、接口基本信息速…