本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、核心概述
@Provide和@Consume是鸿蒙ArkUI框架中用于实现跨组件层级双向数据同步的装饰器,主要特点包括:
- 跨层级传递:摆脱传统父子组件间通过命名参数传递数据的束缚,实现祖先组件与任意后代组件间的直接数据同步
- 双向同步:数据变化在@Provide和@Consume之间是双向流动的
- 自动绑定:通过变量名或别名自动建立关联,无需手动传递
二、核心特性
@Provide装饰器
- 作用:在祖先组件中声明"提供"给后代的状态变量
- 同步类型:双向同步(与所有关联的@Consume变量)
- 初始化:必须本地初始化
- 别名支持:可选参数,允许通过别名绑定
@Consume装饰器
- 作用:在后代组件中"消费"祖先提供的状态变量
- 同步类型:与对应的@Provide变量双向同步
- 初始化:
- API version 20+:支持设置默认值(当找不到匹配的@Provide时使用)
- 早期版本:必须找到匹配的@Provide
三、绑定规则
支持四种绑定方式:
- 相同变量名:
@Provide age: number = 0;
@Consume age: number;
2. 相同变量别名:
@Provide('a') id: number = 0;
@Consume('a') age: number;
3. Provide别名与Consume变量名相同:
@Provide('a') id: number = 0;
@Consume a: number;
4. Provide变量名与Consume别名相同:
@Provide id: number = 0;
@Consume('id') a: number;
四、使用限制
-
参数类型:
- 别名必须是string类型
- 不支持Function类型变量
-
初始化限制:
- @Consume不能通过构造参数初始化
- @Provide必须本地初始化
-
重复定义:
- @Provide的key不能重复定义(除非使用allowOverride参数)
五、支持的数据类型
| 数据类型 | 支持版本 | 观察变化范围 |
|---|---|---|
| boolean, string, number | 全部 | 数值变化 |
| class, Object | 全部 | 赋值和属性变化 |
| Array | 全部 | 数组本身及API操作 |
| Date | API 10+ | 整体赋值和Date方法调用 |
| Map, Set | API 11+ | 整体赋值和Map/Set方法操作 |
| undefined, null | API 11+ | - |
| Length, ResourceStr等联合类型 | API 11+ | - |
备注:不支持装饰Function类型。
六、更新流程
初始渲染流程
- @Provide变量以Map形式传递给所有子组件
- 子组件查找匹配的@Provide变量:
- 优先匹配别名
- 其次匹配变量名
- 建立双向绑定关系
数据更新流程
- @Provide变化时:通知所有关联的@Consume变量及依赖组件更新
- @Consume变化时:将变化同步回对应的@Provide变量
七、其他
跨BuilderNode同步(API 20+)
BuilderNode({
buildOptions: {
enableProvideConsumeCrossing: true
}
})
设置默认值(API 20+)
@Consume count: number = 10; // 当找不到@Provide时使用默认值10
八、与@State/@Link的区别
-
层级关系:
- @State/@Link:仅限于父子组件间
- @Provide/@Consume:可跨任意层级
-
传递方式:
- @State/@Link:需要通过参数显式传递
- @Provide/@Consume:自动传递,无需参数
-
初始化:
- @Link必须从父组件初始化
- @Consume可以从祖先组件或默认值初始化
九、总结
@Provide和@Consume装饰器为鸿蒙应用提供了强大的跨组件状态管理能力,特别适合深层级组件间的数据共享场景。应合理利用其双向同步特性,同时注意版本兼容性和性能优化(如避免过深嵌套)。
2408

被折叠的 条评论
为什么被折叠?



