鴻蒙開發中所有自定義裝飾器的完整案例解析--涵蓋 16 個核心裝飾器的詳細用法和實戰場景

以下是鴻蒙開發中 所有自定義裝飾器的完整案例解析終極總結指南,涵蓋 16 個核心裝飾器的詳細用法和實戰場景:


一、終極總結表:16大裝飾器全景圖

裝飾器類別V1V2核心作用典型場景
@Component組件定義??創建標準組件業務UI組件
@ComponentV2組件定義??創建可繼承組件UI框架基類
@State狀態管理??組件私有狀態計數器、開關狀態
@Local狀態管理??V2組件狀態(可繼承)可繼承的基類狀態
@Prop狀態管理??父→子單向同步接收父組件數據
@Param狀態管理??V2父→子傳參(可繼承)可繼承的組件參數
@Link狀態管理??父子雙向綁定表單控件
@Provide狀態管理??跨層級提供數據主題、配置下發
@Consume狀態管理??跨層級消費數據獲取祖先數據
@BuilderUI構建??定義UI片段復用UI組合
@BuilderParamUI構建??聲明動態插槽可配置布局容器
@StylesUI構建??復用樣式集統一按鈕/卡片樣式
@ExtendUI構建??擴展原生組件樣式定制系統組件
@Reusable性能優化??V1組件實例復用彈窗/高頻切換組件
@ReusableV2性能優化??V2組件實例復用長列表項
@Watch輔助??監聽狀態變化數據變化回調
@Computed輔助(V2專屬)??聲明計算屬性購物車總價

二、組件定義裝飾器

1. @Component (標準組件)
@Component
struct UserCard {
@Prop name: string = "張三"build() {
Column() {
Text(this.name).fontSize(18)
Text("前端開發工程師")
}
}
}

作用:定義可復用的 UI 組件單元


2. @ComponentV2 (實驗性組件)
// @ts-nocheck
@ComponentV2
export struct BaseDialog {
@Local title: string = "系統提示" // V2專屬狀態build() {
Column() {
Text(this.title).fontColor(Color.Red)
this.DialogContent() // 抽象插槽
}
}@BuilderParam DialogContent: () => void = () => Text("默認內容")
}// 繼承基類
@Component
struct ConfirmDialog extends BaseDialog {
@Param message: string // V2專屬傳參@BuilderParam override DialogContent: () => void = () => {
Text(this.message)
Button("確認")
}
}

突破能力:組件繼承、狀態繼承、方法重寫


三、狀態管理裝飾器

3. @State (組件私有狀態)
@State count: number = 0Button(`點擊 ${this.count}`)
.onClick(() => this.count++) // 觸發UI更新
4. @Local (V2 組件狀態)
@ComponentV2
struct Counter {
@Local value: number = 0 // 可被子組件繼承build() { ... }
}
5. @Prop (父→子單向同步)
// 子組件
@Component
struct Child {
@Prop data: string // 接收父組件數據
}// 父組件
Parent() {
Child({ data: parentData }) // 傳遞數據
}
6. @Param (V2 單向傳參)
@ComponentV2
struct ChildV2 {
@Param message: string // 支持繼承
}
7. @Link (父子雙向綁定)
// 子組件
@Component
struct Toggle {
@Link isOn: boolean // 雙向綁定
}// 父組件
@State switchState: boolean = false
Toggle({ isOn: $switchState }) // $表示雙向綁定
8. @Provide/@Consume (跨層級通信)
// 祖先組件
@Component
struct GrandParent {
@Provide theme: string = "dark"
}// 子孫組件(跳過中間層)
@Component
struct Child {
@Consume theme: string // 直接獲取祖先數據
}

四、UI構建裝飾器

9. @Builder (UI片段復用)
@Builder function fancyButton(text: string) {
Button(text)
.backgroundColor('#6200EE')
.fontColor(Color.White)
}// 使用
fancyButton("提交")
10. @BuilderParam (動態插槽)
@Component
struct Card {
@BuilderParam header: () => voidbuild() {
Column() {
this.header() // 動態渲染傳入的UI
}
}
}// 注入內容
Card({ header: () => Text("標題").fontSize(20) })
11. @Styles (樣式復用)
@Styles function warningStyle() {
.backgroundColor('#FFF8E1')
.borderColor('#FFD740')
}Text("警告信息")
.warningStyle() // 應用樣式集
12. @Extend (擴展原生樣式)
@Extend(Text) function titleStyle() {
.fontSize(24)
.fontWeight(FontWeight.Bold)
}Text("章節標題")
.titleStyle() // 擴展原生組件

五、緩存復用裝飾器

13. @Reusable (V1組件緩存)
@Reusable
@Component
struct ExpensiveComponent {
aboutToReuse(params: Object) {
console.log("復用實例", params)
}
}// 使用
ExpensiveComponent().reuseId("comp-1")
14. @ReusableV2 (V2組件緩存)
@ReusableV2
@ComponentV2
struct V2Component {
aboutToReuse() { /* 無參數 */ }
aboutToRecycle() { /* 回收回調 */ }
}// 必須指定reuseId
V2Component().reuse({ reuseId: () => 'v2-comp' })

六、輔助裝飾器

15. @Watch (狀態監聽)
@State counter: number = 0@Watch('counter')
onCountChange(newValue: number, oldValue: number) {
console.log(`值變化:${oldValue}${newValue}`)
}
16. @Computed (計算屬性-V2專屬)
@ComponentV2
struct Cart {
@State items: Item[] = []@Computed
get totalPrice(): number {
return this.items.reduce((sum, item) => sum + item.price, 0)
}
}

七、三大黃金實踐法則

法則1:裝飾器選型決策樹
graph TD
A[開發組件類型] --> B{是否需繼承?}
B -->|是| C[用@ComponentV2+@Local]
B -->|否| D[用@Component]
D --> E{是否高頻創建?}
E -->|是| F[添加@Reusable]
E -->|否| G[標準實現]
C --> H{是否需緩存?}
H -->|是| I[添加@ReusableV2]
法則2:狀態管理三原則
  1. 數據流向
  • 單向數據流:父 → @Prop → 子
  • 雙向同步:父 ? @Link ? 子
  1. 層級穿透
  • 跨層級:祖先 @Provide → 子孫 @Consume
  1. V2優先
  • 繼承場景:@Local > @State@Param > @Prop
法則3:性能優化組合拳
場景優化方案效果提升
長列表@ReusableV2 + LazyForEach滾動幀率提升 300%
高頻顯示/隱藏@Reusable + reuseId切換耗時降低 80%
復雜計算@Computed + 緩存策略計算耗時減少 70%
樣式復用@Styles + @Extend代碼量減少 60%

八、避坑指南(血淚經驗)

  1. TS兼容問題
// 在V2組件文件頂部添加
// @ts-nocheck
  1. 裝飾器沖突
  • ? 禁止混用 @State@Local
  • ? 避免同時使用 @Prop@Param
  1. 緩存陷阱
// 錯誤!每次創建新ID導致無法復用
.reuse({ reuseId: () => Date.now().toString() })// 正確:相同類型組件使用固定ID
.reuse({ reuseId: () => 'user-card' })
  1. V2組件限制
  • 不可在 @ComponentV2 中使用 @StorageProp
  • 禁止跨 V1/V2 組件繼承

九、演進路線圖(2025)

  1. Q1
  • @ComponentV2 結束實驗階段
  • @Computed 支持 V1 組件
  1. Q2
  • 新增 @Mixin 混入裝飾器
  • 推出 @Animate 動畫裝飾器
  1. Q3
  • 統一 V1/V2 狀態管理模型
  • 廢棄 @Local@Param

官方資源:

  • ArkUI 裝飾器文檔

掌握這些裝飾器組合用法,可大幅提升鴻蒙開發效率和性能表現。建議從 @Component + @Prop + @Builder 基礎組合起步,逐步探索高級用法。

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

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

相關文章

【C++】哈希表的實現(unordered_map和unordered_set的底層)

文章目錄 目錄 文章目錄 前言 一、unordered_set和unordered_map介紹 二、哈希表的介紹 三、哈希沖突的解決方法 1.開放定址法 2.鏈地址法 四、兩種哈希表代碼實現 總結 前言 前面我們學習了紅黑樹,紅黑樹就是map和set的底層,本篇文章帶來的是unordered…

歐拉公式的意義

歐拉公式的意義 歐拉公式(Euler’s Formula)是數學中最重要的公式之一,它將復數、指數函數和三角函數緊密聯系在一起。其基本形式為: eiθcos?θisin?θ e^{i\theta} \cos \theta i \sin \theta eiθcosθisinθ 當 θπ\thet…

Linux Docker 運行SQL Server

在Linux操作系統,已安裝docker,現在以docker compose方式,安裝一個最新版SQL Server 2022的數據庫。 # 建個目錄(請不要照抄,我的數據盤在/data,你可以改為/opt) mkdir /data/sqlserver# 進入目…

C++:stack_queue(2)實現底層

文章目錄一.容器適配器1. 本質:2. 接口:3. 迭代器:4. 功能:二.deque的簡單介紹1.概念與特性2.結構與底層邏輯2.1 雙端隊列(deque)結構:2.2 deque的內部結構2.3 deque的插入與刪除操作&#xff1…

Lightroom 安卓版 + Windows 版 + Mac 版全適配,編輯管理一站式,專業攝影后期教程

軟件是啥樣的? Adobe Lightroom 這軟件,在安卓手機、Windows 電腦和 Mac 電腦上都能用。不管是喜歡拍照的人,還是專門搞攝影的,用它都挺方便,能一站式搞定照片編輯、整理和分享這些事兒。 ****下載地址 分享文件:【Li…

office卸載不干凈?Office356卸載不干凈,office強力卸載軟件下載

微軟官方認可的卸載工具,支持徹底清除Office組件及注冊表殘留。需要以管理員身份運行,選擇“移除Office”功能并確認操作。 Office Tool Plus安裝地址獲取 點擊這里獲取:Office Tool Plus 1、雙擊打開軟件 image 2、選擇左右的工具箱&…

互聯網企業慢性死亡的招聘視角分析:從崗位割裂看戰略短視

內容簡介: 一個獵頭和HR的簡單拒絕,揭示了中國互聯網企業人才觀念的深層問題。通過分析崗位過度細分現象,本文探討了戰略短視、內斗文化和核心競爭力缺失如何導致企業慢性死亡,并提出了系統性的解決方案。#互聯網企業 #人才招聘 #…

OpenBMC中phosphor-dbus-interfaces深度解析:架構、原理與應用實踐

引言 在OpenBMC生態系統中,phosphor-dbus-interfaces作為D-Bus接口定義的核心組件,扮演著系統各模塊間通信"契約"的關鍵角色。本文將基于OpenBMC源碼,從架構設計、實現原理到實際應用三個維度,全面剖析這一基礎組件的技…

駕駛場景玩手機識別準確率↑32%:陌訊動態特征融合算法實戰解析

原創聲明本文為原創技術解析文章,核心技術參數與架構設計參考自《陌訊技術白皮書》,轉載請注明出處。一、行業痛點:駕駛場景行為識別的現實挑戰根據交通運輸部道路運輸司發布的《駕駛員不安全行為研究報告》顯示,駕駛過程中使用手…

Mysql——單表最多數據量多少需要分表

目錄 一、MySql單表最多數據量多少需要分表 1.1、阿里開發公約 1.2、一個三層的B+樹,它最多可以存儲多少數據量 1.3、示例 1.3.1、示例表中一行的數據占多少字節數 1.3.2、示例表中一頁里面最多可以存多少條記錄 1.3.3、按示例表計算,一個三層的B+樹,可以放多少條100字節的數…

scikit-learn/sklearn學習|嶺回歸解讀

【1】引言 前序學習進程中,對用scikit-learn表達線性回歸進行了初步解讀。 線性回歸能夠將因變量yyy表達成由自變量xxx、線性系數矩陣www和截距bbb組成的線性函數式: y∑i1nwi?xibwTxby\sum_{i1}^{n}w_{i}\cdot x_{i}bw^T{x}byi1∑n?wi??xi?bwTxb實…

基于Django的圖書館管理系統的設計與實現

基于Django的圖書館管理系統的設計與實現、

ComfyUI版本更新---解決ComfyUI的節點不兼容問題

前言: 新版本的COMFYUI與節點容易出現不兼容的問題,會導致整個系統崩掉。 目錄 一、前期準備工作:虛擬環境配置 為什么需要虛擬環境? 具體操作步驟 二、常見問題解決方案 1、工作流輸入輸出圖像不顯示問題 2、工作流不能拖動&#xff0…

生產管理ERP系統|物聯及生產管理ERP系統|基于SprinBoot+vue的制造裝備物聯及生產管理ERP系統設計與實現(源碼+數據庫+文檔)

生產管理ERP系統 目錄 基于SprinBootvue的制造裝備物聯及生產管理ERP系統設計與實現 一、前言 二、系統設計 三、系統功能設計 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取: 博主介紹:??大廠碼農|畢…

Numpy科學計算與數據分析:Numpy數組創建與應用入門

Numpy數組創建實戰 學習目標 通過本課程的學習,學員將掌握使用Numpy庫創建不同類型的數組的方法,包括一維數組、多維數組、全零數組、全一陣列、空數組等。本課程將通過理論講解與實踐操作相結合的方式,幫助學員深入理解Numpy數組的創建過程…

如何回收內存對象,有哪些回收算法?

它的主要不足有兩個: 效率問題,標記和清除兩個過程的效率都不高。 空間問題,標記清除之后會產生大量不連續的內存碎片,空間碎片太多可能會導致以后在程序運行過程中需 要分配較大對象時,無法找到足夠的連續內存而不得不…

Numpy科學計算與數據分析:Numpy文件操作入門之數組數據的讀取和保存

Numpy文件讀寫實戰 學習目標 通過本課程,學員將深入了解如何使用Numpy庫進行數組數據的讀取和保存,包括文本文件和二進制文件的處理方法。通過本課程的學習,學員將能夠熟練掌握Numpy在文件操作中的應用,為數據處理和分析打下堅實…

AutoMQ-Kafka的替代方案實戰

AutoMQ無縫兼容kafka,并且借助S3實現數據統一存儲。這個確實解決了大問題! 1. Kafka的挑戰 橫向擴展困難:擴容kafka需要手動創建分區遷移策略和復制分區數據。這個過程不僅風險高、資源密集而且耗時。存儲成本高:計算和存儲在kaf…

Numpy科學計算與數據分析:Numpy線性代數基礎與實踐

Numpy線性代數實踐:從矩陣乘法到特征值 學習目標 通過本課程,學員將掌握Numpy中處理線性代數問題的基本方法,包括矩陣乘法、求解線性方程組以及計算特征值和特征向量。本課程將通過理論與實踐相結合的方式,幫助學員深入理解這些…

CrackMapExec--安裝、使用

用途限制聲明,本文僅用于網絡安全技術研究、教育與知識分享。文中涉及的滲透測試方法與工具,嚴禁用于未經授權的網絡攻擊、數據竊取或任何違法活動。任何因不當使用本文內容導致的法律后果,作者及發布平臺不承擔任何責任。滲透測試涉及復雜技…