Harmony狀態管理 @Local和@Param

深入理解ArkUI中的@Param與@Local裝飾器

引言

在ArkUI的狀態管理系統中,@Param和@Local是兩個核心裝飾器,它們分別用于處理組件間的數據傳遞和組件內部狀態管理。本文將詳細介紹這兩個裝飾器的使用場景、特性差異以及最佳實踐。

@Param裝飾器:組件外部輸入

@Param裝飾器用于增強子組件接受外部參數輸入的能力,支持數據同步變化,并允許在組件間進行數據傳遞與同步。

核心特性

  1. 外部輸入:@Param表示組件從外部傳入的狀態
  2. 同步機制:當數據源也是狀態變量時,數據源的修改會同步給@Param
  3. 類型支持:支持number、boolean、string、Object、class等基本類型以及Array、Set、Map、Date等內嵌類型
  4. 觀測能力:裝飾的變量變化時,會刷新該變量關聯的組件

基本用法示例

@ComponentV2
struct ChildComponent {@Param message: string = 'default';build() {Text(this.message)}
}@Entry
@ComponentV2
struct ParentComponent {@Local parentMessage: string = 'Hello from parent';build() {Column() {ChildComponent({ message: this.parentMessage })}}
}

高級特性

  1. 聯合類型支持
@Param count: number | undefined = 0;
  1. 對象屬性修改
// 可以修改對象屬性,會同步到父組件
@Param info: Info;
Button('Change name').onClick(() => {this.info.name = 'New Name';
})

@Local裝飾器:組件內部狀態

@Local裝飾器用于在@ComponentV2裝飾的自定義組件中表示內部狀態,使變量具有觀測變化的能力。

核心特性

  1. 內部狀態:只能在組件內部初始化,不允許外部傳入
  2. 變化觀測:變量變化時會觸發UI刷新
  3. 類型支持:支持多種數據類型,但對深層對象屬性的觀測需依賴@ObservedV2和@Trace裝飾器

基本用法示例

@Entry
@ComponentV2
struct Counter {@Local count: number = 0;build() {Column() {Text(`Count: ${this.count}`)Button('Increment').onClick(() => {this.count++;})}}
}

高級用法

  1. 復雜類型處理
@ObservedV2
class User {@Trace name: string;@Trace age: number;
}@Entry
@ComponentV2
struct UserProfile {@Local user: User = new User('Alice', 25);build() {Column() {Text(`Name: ${this.user.name}`)Text(`Age: ${this.user.age}`)Button('Increase Age').onClick(() => {this.user.age++;})}}
}

@Param與@Local對比

特性@Param@Local
初始化來源外部傳入或本地默認值必須本地初始化
同步方向父到子單向同步僅組件內部
可觀測性觀測變量本身觀測變量本身
修改權限子組件不可直接修改(除非@Once)組件內可自由修改
使用場景組件間數據傳遞組件內部狀態管理
復雜類型支持支持,需配合@ObservedV2/@Trace支持,需配合@ObservedV2/@Trace

實際應用場景

場景1:表單組件

// 父組件
@Entry
@ComponentV2
struct FormPage {@Local formData: FormData = new FormData();build() {Column() {FormInput({ data: this.formData.username })FormInput({ data: this.formData.password })SubmitButton({ formData: this.formData })}}
}// 子輸入組件
@ComponentV2
struct FormInput {@Param data: string = '';build() {TextInput(this.data)}
}

場景2:列表項狀態管理

@ObservedV2
class TodoItem {@Trace text: string;@Trace completed: boolean;
}@Entry
@ComponentV2
struct TodoList {@Local items: TodoItem[] = [new TodoItem('Buy milk'),new TodoItem('Call mom')];build() {List() {ForEach(this.items, (item) => {ListItem() {TodoItemComponent({ item: item })}})}}
}@ComponentV2
struct TodoItemComponent {@Param item: TodoItem;build() {Row() {Text(this.item.text).decoration({ type: this.item.completed ? TextDecorationType.LineThrough : TextDecorationType.None })Checkbox(this.item.completed).onChange((checked) => {this.item.completed = checked;})}}
}

最佳實踐

  1. 合理選擇裝飾器
    • 需要從父組件接收數據時使用@Param
    • 純內部狀態管理使用@Local
  2. 復雜類型處理
    • 對于嵌套對象,使用@ObservedV2和@Trace確保深度觀測
  3. 性能優化
    • 避免在@Param和@Local中存儲過大對象
    • 對于頻繁變化的復雜數據,考慮使用@Computed計算屬性
  4. 代碼組織
    • 將@Local狀態變量集中在組件頂部聲明
    • 為@Param提供合理的默認值

常見問題解決

問題1:為什么子組件修改@Param變量不生效?

解決方案:@Param默認是只讀的,如果需要修改,可以:

  1. 使用@Param @Once組合
  2. 通過事件通知父組件修改
  3. 修改對象屬性而非對象本身

問題2:如何深度觀測嵌套對象?

解決方案:使用@ObservedV2和@Trace裝飾器:

@ObservedV2
class DeepObject {@Trace nested: {@Trace deepValue: string;};
}

總結

@Param和@Local是ArkUI狀態管理的兩大基石,理解它們的特性和適用場景對于構建可維護、高性能的ArkUI應用至關重要。@Param實現了組件間的數據流動,而@Local管理了組件內部的狀態生命周期。合理運用這兩個裝飾器,結合@ObservedV2和@Trace等輔助裝飾器,可以構建出響應式、結構清晰的UI組件。

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

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

相關文章

物聯網攝像頭模塊的應用場景

一、智慧城市治理 ?智能交通優化? ?動態信號控制?:杭州部署20萬物聯網攝像頭,實時分析車流密度并聯動1200個紅綠燈,早高峰通行效率提升40%。 ?違規行為識別?:搭載GB/T28181協議的攝像頭AI抓拍交通違章,車牌識…

k8s Ingress、Service配置各樣例大全

目錄 壹、k8s Ingress 樣例大全🔧 一、基礎路由與 TLS 終止🔄 二、高級路由控制1. **URL 重寫**(適用后端服務路徑與入口路徑不一致)2. **多路徑路由到不同服務** 🚦 三、流量治理策略1. **金絲雀發布(灰度…

領域驅動設計(DDD)【10】之DDD戰術模式:工廠模式與表意接口模式

文章目錄 引言:DDD戰術模式的重要性一、DDD中的工廠模式1.1 工廠模式的核心概念1.2 工廠模式的三種實現方式1.2.1 簡單工廠方法1.2.2 工廠類1.2.3 抽象工廠模式 1.3 工廠模式的適用場景1.4 實際案例:電商訂單系統 二、表意接口模式2.1 表意接口2.2 表意接…

鴻蒙ArkTS---登錄邏輯,數據持久化,ArkUI,網絡請求等基礎內容記錄

該內容是在【博學谷】學習過程中的代碼記錄,如有任何問題請與作者聯系。 也歡迎同在學習鴻蒙開發的小伙伴的留言,一同學習,一同進步。 功能實現(只記錄代碼,沒有相關配置,跑不起來)&#xff…

沒有公網ip可以實現跨網p2p互通嗎?內網讓公網直連訪問常用工具

沒有公網IP的情況下仍然可以實現P2P通信,但需要借助NAT穿透技術或類似nat123同端口映射等第三方工具實現內網穿透?。???? 一、什么是P2P通信? P2P網絡(Peer-to-Peer Network)是一種去中心化的網絡架構,其中每個…

云服務器安裝寶塔面板(BT Panel)

安裝寶塔面板(BT Panel)是很多服務器管理員常用的操作,尤其適合用于管理網站、數據庫、FTP等。以下是基于 Linux 系統(推薦 CentOS 或 Ubuntu)的寶塔面板安裝步驟。 安裝前準備 云服務器一臺 可以訂購服務器 海外云主…

mongoose解析http字段值

最近在使用mongoose開發嵌入式web后端時,會遇到要解析js前端發送過來的http消息,比如傳遞用戶名,密碼過來,后端要解析出來并判斷是否登錄成功。 前端http有兩種組裝字段的方式。 第一種是 $.ajax({url: /upgradePackage,method: P…

高德地圖地址解析獲取經緯度失敗原因JSAPI

高德地圖地址解析獲取經緯度失敗原因JSAPI 地圖加載的時候老是報異常碼,地圖是可以加載出來的,但是在地圖上的操作老是有異常碼,找了好久不知道什么問題,異常碼會報兩種,一種是說什么key的問題,但是我當時…

極速JavaScript:全面性能優化實戰指南

在現代Web開發中,JavaScript性能直接影響用戶體驗。一個優化良好的應用能帶來更流暢的交互、更快的加載速度和更低的資源消耗。本文將深入探討實用的JavaScript性能優化技術,幫助您打造高性能Web應用。 一、性能瓶頸分析與診斷工具 性能問題的常見來源&…

【開源模型】高考數學139分!小米MiMo開源模型:7B參數突出重圍

小米 MiMo:7 B 參數撬動推理巔峰,開源模型的技術突圍 70 億參數超越 320 億對手,高考數學 139 分的背后是訓練策略的全面革新。 2025 年 4 月 30 日,小米開源的首個推理大模型 Xiaomi MiMo-7 B 橫空出世,以??僅 7 B …

用vscode破解最新typora1.10.8

1.下載格式化插件防止打開文件一團亂 1)下載vscode: Download Visual Studio Code - Mac, Linux, Windows 2)vscode下載中文插件重啟 如果沒變中文,在vscode界面按下: ctrl shift p 調出命令行 再輸入&#xff…

在 CI/CD 流程中使用 Jenkins 與 Docker 集成

在 CI/CD 流程中,Jenkins 與 Docker 的集成可以實現自動構建、測試、打包、發布容器鏡像,并部署到測試/生產環境。下面是從概念到落地操作的完整集成方案。 一、常見的集成方式有哪些? 方式描述1?? Jenkins 主機安裝 DockerJenkins 可以直…

閑庭信步使用SV搭建圖像測試平臺:第十課——繼續說說類

(本系列只需要modelsim即可完成數字圖像的處理,每個工程都搭建了全自動化的仿真環境,只需要雙擊top_tb.bat文件就可以完成整個的仿真,大大降低了初學者的門檻!!!!如需要該系列的工程…

如何改進復雜推理 - 從提示詞設計入手

引言(動機) 在使用大語言模型(如 GPT-4、Claude、DeepSeek 等)構建智能問答、輔助決策或復雜任務代理系統時,可能遇到這些問題: 模型回答跳步驟、思路混亂同樣問題,模型表現高度不穩定新任務一…

如何解決和各個經銷商不同軟件對接的問題?湯臣案例分享

一、項目背景 湯臣倍健作為健康產品行業的領軍企業,其營銷云系統與全國經銷商 ERP 系統的數據無縫對接,對于提升業務運營效率和營銷精準度至關重要。傳統數據集成方法在面對經銷商 ERP 系統的多樣性和復雜性時,暴露出諸多問題,如…

Wordvice AI:Wordvice 推出的免費,基于先進的 AI 技術幫助用戶提升英文寫作質量

Wordvice AI:智能寫作助手,助力高效英文寫作 在當今全球化時代,英文寫作已成為眾多學生、研究人員、職場人士必備技能。然而,語法錯誤、表達不流暢、詞匯匱乏等問題常困擾著大家。別擔心,今天就來給大家介紹一款強大的…

【UE5】如何開發安卓項目的udp客戶端

1關于如何打包安卓項目這里就不贅述了 2代碼舉例。最重要的就是這兩句 #if PLATFORM_ANDROID #endif#if PLATFORM_WINDOWS #endif全部代碼如下: Button_Sheng.h: // Fill out your copyright notice in the Description page of Project Settings.#pragma once#in…

2025年6月21和22日復習和預習(python)

一、作業內容 (一)知識點回顧 用戶輸入處理 使用input()函數獲取用戶輸入的字符串,并存儲到變量中。 條件判斷語句 if-elif-else結構:根據不同條件執行相應代碼塊,適用于多分支判斷。 語音合成技術 導入pyttsx3庫實現…

Vue 樣式穿透語法大全(涵蓋 Vue2、Vue3、Less、Scss 等)

1. 什么是樣式穿透? 樣式穿透是在使用 Vue 組件時,為了修改子組件或第三方組件的樣式而使用的一種特殊語法。當我們使用 scoped 樣式時,由于樣式被限制在當前組件內,要修改子組件的樣式就需要使用樣式穿透。 2. 為什么需要樣式穿…

Python 屬性查找:深入理解__getattribute__與__getattr__

目錄 一、__getattribute__方法詳解 1.1 基本概念 1.2 示例分析 1.3 注意事項 二、__getattr__方法詳解 2.1 基本概念 2.2 示例分析 2.3 注意事項 三、__getattribute__與__getattr__的區別對比 3.1 調用時機 3.2 應用場景 3.3 性能影響 四、屬性查找順序 屬性查找…