📚 鸿蒙进阶专栏 · 第 12 篇 / 共 20 篇(进阶篇 11-20)
上一篇:组件化开发:@Builder、@Component | 下一篇:数据持久化:Preferences 与 RDB 数据库

状态管理进阶:@Provide/@Consume 与 AppStorage 全局状态

目录

状态管理进阶:@Provide/@Consume 与 AppStorage 全局状态

一、@Provide / @Consume:跨层级直达

二、AppStorage:应用级内存状态

三、PersistentStorage:重启也不丢

四、选型速查表

五、下一篇预告


 

入门篇的 @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。


进阶系列持续更新中,点赞 + 收藏 + 关注不迷路。
遇到问题评论区贴报错信息 + 关键代码,看到都会回。也欢迎留言点播你想看的进阶主题。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐