鸿蒙开发中所有自定义装饰器的完整案例解析--涵盖 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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--安装、使用

用途限制声明,本文仅用于网络安全技术研究、教育与知识分享。文中涉及的渗透测试方法与工具,严禁用于未经授权的网络攻击、数据窃取或任何违法活动。任何因不当使用本文内容导致的法律后果,作者及发布平台不承担任何责任。渗透测试涉及复杂技…