【鸿蒙开发进阶】第12篇:状态管理进阶:@Provide/@Consume 与 AppStorage 全局状态
·
📚 鸿蒙进阶专栏 · 第 12 篇 / 共 20 篇(进阶篇 11-20)
上一篇:组件化开发:@Builder、@Component | 下一篇:数据持久化:Preferences 与 RDB 数据库
状态管理进阶:@Provide/@Consume 与 AppStorage 全局状态
目录
状态管理进阶:@Provide/@Consume 与 AppStorage 全局状态
入门篇的 @State/@Prop/@Link 解决了「父子」通信。但状态要跨 5 层组件传递时怎么办?要全局共享时怎么办?这篇补齐整张地图。

一、@Provide / @Consume:跨层级直达
祖先组件 @Provide,任意深度的后代 @Consume,中间层完全不用传话:
// 祖先组件
@Entry
@Component
struct GrandParent {
@Provide('theme') themeColor: string = '#0A59F7' // 声明提供
build() {
Column() { Middle() } // Middle 内部还有 Child
}
}
// 任意深度的后代组件
@Component
struct DeepChild {
@Consume('theme') themeColor: string // 直接取用,双向同步
build() {
Text('主题色').fontColor(this.themeColor)
}
}
💡 适合「主题色、用户信息」这类贯穿多层的全局 UI 数据。注意它也是双向的,别滥用。
二、AppStorage:应用级内存状态
AppStorage 是应用级的 KV 存储,所有页面共享,跨页面同步的最佳拍档:
// 页面 A 写入
AppStorage.setOrCreate<number>('cartCount', 3)
// 页面 B 读取并保持同步
@Entry
@Component
struct PageB {
@StorageLink('cartCount') cartCount: number = 0 // 双向
// @StorageProp('cartCount') —— 单向,按需选
build() {
Text(`购物车:${this.cartCount} 件`)
}
}
三、PersistentStorage:重启也不丢
// 入口 EntryAbility.ets 的 onCreate 里初始化一次
PersistentStorage.persistProp<string>('token', '')
// 之后像普通 AppStorage 一样用,自动落盘
@StorageLink('token') token: string = ''
⚠️ PersistentStorage 只适合存少量简单数据(token、开关)。大数据请用下一篇的数据库,否则拖慢启动。
四、选型速查表
| 需求 | 方案 |
|---|---|
| 组件内部状态 | @State |
| 父 ↔ 子 | @Prop / @Link |
| 祖先 ↔ 任意后代 | @Provide / @Consume |
| 跨页面共享(内存) | AppStorage + @StorageLink |
| 跨页面共享(落盘) | PersistentStorage |
| 结构化大数据 | RDB 数据库(下篇) |
五、下一篇预告
状态只在内存里,App 一关就没了。下一篇讲数据怎么「留下来」:Preferences 与关系型数据库 RDB。
进阶系列持续更新中,点赞 + 收藏 + 关注不迷路。
遇到问题评论区贴报错信息 + 关键代码,看到都会回。也欢迎留言点播你想看的进阶主题。
更多推荐



所有评论(0)