【HarmonyOS 5】鴻蒙中@State的原理詳解

一、@State在鴻蒙中是做什么的?

@State?是 HarmonyOS ArkTS 框架中用于管理組件狀態的核心裝飾器,其核心作用是實現數據驅動 UI 的響應式編程模式。通過將變量標記為?@State,開發者可以確保當狀態值發生變化時,依賴該狀態的 UI 組件會自動重新渲染,從而保持數據與界面的實時同步。

@State?是 HarmonyOS ArkTS 實現響應式編程的大基礎核心,可以說整個V1和V2都是圍繞它來進行組合使用。

image.png

二、@State的基本原理

@State?的響應式機制基于?依賴收集?和?變更通知?兩大核心流程,結合 TypeScript 裝飾器和元編程技術實現。其核心原理是通過依賴收集和變更通知機制,確保狀態變化自動同步到 UI。

1.?依賴關系的收集

當組件渲染時,ArkUI框架會追蹤所有被?@State?修飾的變量在 UI組件 中的使用情況。
通過裝飾器在變量的 getter 中注入依賴收集邏輯,記錄當前組件對該狀態的依賴關系。觀察者的模式來進行數據變化的監控。
例如,當組件的Text中使用?this.message,框架會將該組件注冊為?message?的依賴者。

@Entry
@Component
struct Index {@State message: string = 'Hello World';build() {RelativeContainer() {Text(this.message).id('HelloWorld').fontSize($r('app.float.page_text_font_size')).fontWeight(FontWeight.Bold).alignRules({center: { anchor: '__container__', align: VerticalAlign.Center },middle: { anchor: '__container__', align: HorizontalAlign.Center }}).onClick(() => {this.message = 'Welcome';})}.height('100%').width('100%')}
}
2.?數據變更通知

當?@State?變量通過?this.message = xxxxxx?被修改時,框架會檢測到值的變化。
使用?Proxy?或?Object.defineProperty?攔截屬性的賦值操作,觸發變更通知。
框架遍歷所有依賴該狀態的組件,并調用其更新方法重新渲染 UI。
采用?臟檢查優化?和?異步渲染隊列,合并多次更新操作,避免頻繁重繪

響應式系統的核心流程
數據變化 → 依賴追蹤 → 自動重渲染(60FPS 高幀率更新)

(1)數據變化:開發者通過?this.xxx = value?修改狀態。
(2)依賴追蹤:ArkUI框架根據之前收集的依賴關系,確定哪些組件需要更新。(哪個UI組件用了@State修飾的變量。)
(3)自動重渲染:僅重新渲染依賴該狀態的組件,提升性能。(最小限度的刷新UI)

三、使用@State的注意事項

在使用?@State?時,需注意以下關鍵點以避免潛在問題:

1. 必須初始化
@State?變量必須在組件構造函數中初始化,否則會導致編譯錯誤。

 @Componentstruct MyComponent {@State count: number = 0; // 正確初始化// @State message: string; // 錯誤:未初始化}

2. 通過?this?賦值
必須通過?this.xxx = value?修改狀態,直接賦值(如?xxx = value)不會觸發 UI 更新。

 onClick() {this.count = 1; // 正確,觸發 UI 更新this.obj = { ...this.obj, key: 'new' }; // 正確,整體賦值this.obj.key = 'new'; // 錯誤,直接修改屬性不觸發更新}

3. 避免頻繁更新
連續多次修改狀態會導致多次重繪,可通過合并操作優化。

注意:

  1. 將獨立變化的狀態拆分為多個?@State?變量,避免不必要的組件刷新。
  2. 深層嵌套的對象或數組可能導致性能下降,建議使用扁平結構。
  3. 組件銷毀時,@State?變量會自動釋放,但需注意手動清理定時器等外部資源。

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

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

相關文章

influxdb數據導出筆記

influx query ‘from(bucket: “byt-grid-data”) |> range(start: 2025-04-01T00:00:00Z, stop: 2025-04-02T23:59:59Z) |> filter(fn: > r[“_measurement”] “byt-gzsn-hsxn-sc-dcs”) |> filter(fn: > r[“_field”] “F_ACT_FZZ02_FB_O”) |> filt…

HTTP Content-Type:深入解析與應用

HTTP Content-Type:深入解析與應用 引言 在互聯網世界中,數據傳輸是至關重要的。而HTTP協議作為最常用的網絡協議之一,其在數據傳輸過程中扮演著關鍵角色。其中,HTTP Content-Type頭字段在數據傳輸中發揮著至關重要的作用。本文將深入解析HTTP Content-Type,并探討其在實…

使用SQL查詢ES數據

使用SQL查詢ES數據 32 進階:使用SQL查詢ES數據環境準備利用腳本導入測試數據 SQL學習基本查詢排序查詢過濾查詢范圍查詢分組查詢(group)分組過濾查詢(grouphaving)聚合函數統計limit查詢分頁查詢 32 進階:使用SQL查詢ES數據 環境準備 需要首先安裝ES8.…

禁止頁面滾動的方法-微信小程序

在微信小程序中,有幾種方法可以禁止頁面滾動: 一、通過頁面配置禁止滾動 在頁面的JSON配置文件中設置,此方法完全禁止頁面的滾動行為: {"disableScroll": true }二、通過 CSS 樣式禁止滾動 在頁面的WXSS文件中添加&…

用戶畫像(https://github.com/memodb-io/memobase)應用

1.下載項目的源代碼,我們要先啟動后端,用docker啟動 cd src/server cp .env.example .env cp ./api/config.yaml.example ./api/config.yaml 這里我的配置內容如下config.yaml(因為我是調用的符合openai格式的大模型,所以我沒改,如果要是別的大模型的話,需要自己再做兼容…

微信小程序生成某個具體頁面的二維碼

微信小程序,如果要生成某個具體頁面,而非首頁的二維碼,體驗和正式的生成方法如下: 1、體驗版二維碼: 管理---版本管理---修改頁面路徑,輸入具體頁面的路徑以及參數,生成的是二維碼 2、正式小程…

【今日三題】小樂樂改數字 (模擬) / 十字爆破 (預處理+模擬) / 比那名居的桃子 (滑窗 / 前綴和)

??個人主頁:小羊 ??所屬專欄:每日兩三題 很榮幸您能閱讀我的文章,誠請評論指點,歡迎歡迎 ~ 目錄 小樂樂改數字 (模擬)十字爆破 (預處理模擬)比那名居的桃子 (滑窗 / 前綴和) 小樂樂改數字 (模擬) 小樂樂改數字…

四旋翼無人機手動模式

無人機的手動模式(Manual Mode)是指飛手完全通過遙控器手動控制無人機的飛行姿態、高度、方向和速度,?無需依賴自動穩定系統或輔助功能?(如GPS定位、氣壓計定高、視覺避障等)。這種模式賦予操作者最大的操控自由度&a…

C++高精度算法(加、減、乘)

首先聲明,沒有除法是因為我不會(手動狗頭_doge) 簡介 顧名思義,高精度算法是用來算一些超級大的數,比如長到 longlong 都存不下的那種,還有就是小數點后好多位,double都存不下的那種&#xff…

思科交換機配置

以下是交換機配置的詳細步驟指南,適用于Cisco交換機,其他品牌需調整命令: 1. 初始連接與基本配置 連接方式:使用Console線連接交換機,通過終端軟件(如PuTTY)登錄。波特率:9600&…

數據質量問題中,數據及時性怎么保證?如何有深度體系化回答!

數據治理,數據質量這快是中大廠,高階大數據開發面試必備技能,企業基于大數據底座去做數倉,那么首先需要保障的就是數據質量。 數據質量的重要性在現代企業中變得越發突出。以下是數據質量的幾個關鍵方面,說明其對企業…

【學習筆記】CPU 的“超線程”是什么?

1. 什么是超線程? 超線程(Hyper-Threading)是Intel的技術,讓一個物理CPU核心模擬出兩個邏輯核心。 效果:4核CPU在系統中顯示為8線程。 本質:通過復用空閑的硬件單元(如ALU、FPU)&a…

閉包的理解

一、閉包的概念 當通過調用外部函數返回的內部函數后,即使外部函數已經執行結束了,但是被內部函數引用的外部函數的變量依然會保存在內存中,我們把引用了其他函數作用域變量的函數和這些被引用變量的集合,稱為閉包(Clo…

從小米汽車事故反思 LabVIEW 開發

近期,小米汽車的一起嚴重事故引發了社會各界的廣泛關注。這起事故不僅讓我們對智能汽車的安全性產生了深深的思考,也為 LabVIEW 開發領域帶來了諸多值得汲取的知識與領悟。 在智能汽車領域,尤其是涉及到智能駕駛輔助系統時,安全是…

項目進度延誤的十大原因及應對方案

項目進度延誤主要源于以下十大原因:目標不明確、需求頻繁變更、資源配置不足或不合理、溝通不暢、風險管理不足、缺乏有效的項目監控、技術難題未及時解決、團隊協作效率低下、決策鏈過長、外部因素影響。其中,需求頻繁變更是導致延誤的關鍵因素之一&…

AI 賦能 DBA:如何用 DeepSeek 等大模型簡化數據庫管理工作

AI 賦能 DBA:如何用 DeepSeek 等大模型簡化數據庫管理工作 摘要: 數據庫管理員(DBA)的工作涉及 SQL 優化、故障排查、性能監控等復雜任務。而 DeepSeek、ChatGPT 等大模型可以大幅減少重復勞動,提高 DBA 的工作效率。本文將結合真實案例,介紹如何利用 AI 優化 DBA 工作流…

vxe-table4.6 + vue3.2 + ant-design-vue 3.x 實現對列的顯示、隱藏、排序

概要 vxe-table中的vxe-toolbar沒有拖拽功能&#xff0c;故自己實現 源碼 <template><a-popover v-model:visible"open" placement"bottomRight" trigger"click"><template #content><div class"content">…

c++基礎知識二

1.面向對象 1.1 定義 面向對象編程是一種程序設計方法,它將數據和操作數據的方法封裝在一起,形成類。類是一種用戶自定義的數據類型,它包含了數據和對數據的操作方法。面向對象編程的特點包括封裝、繼承、多態 1.2 訪問控制符 public 公有屬性,方法。都可以訪問 prot…

Netty之ChannelOutboundBuffer詳解與實戰

深入理解Netty的高低水位線機制及其應用實踐 在高性能網絡編程中&#xff0c;Netty作為一個廣泛使用的異步事件驅動的Java框架&#xff0c;其高效的流量控制機制對于系統的穩定性和性能至關重要。本文將深入探討Netty中的高低水位線&#xff08;High/Low Water Mark&#xff0…

(自用)WebSocket創建流程

在Spring Boot項目中新建WebSocket服務&#xff0c;可以按照以下詳細步驟進行操作&#xff1a; 1.創建Spring Boot項目 可以通過Spring Initializr&#xff08;<>&#xff09;快速創建一個新的Spring Boot項目&#xff0c;添加Spring Web和Spring Boot DevTools依賴&…