# AppStorageV2新一代状态管理

一、引言

AppStorageV2是HarmonyOS NEXT在ArkUI框架中引入的新一代应用级状态管理机制。它在AppStorage的基础上进行了全面增强,提供了类型安全的连接模式、复杂对象支持、工厂函数初始化等特性,特别适合企业级应用中的复杂业务状态管理。

在"星办OA"企业办公审批项目中,AppStorageV2扮演着核心角色——通过AppStorageV2.connect<ApprovalStore>()连接审批状态仓库,实现了审批数据、消息数据、员工信息在多个页面间的共享和同步。本文将深入分析AppStorageV2的核心机制,对比其与AppStorage的差异,并结合项目中的实际代码,探讨新一代状态管理的最佳实践。

二、AppStorageV2基础

2.1 核心概念

AppStorageV2是AppStorage的升级版本,主要改进包括:

  • 类型安全:通过泛型参数提供类型安全的连接
  • 复杂对象:支持@ObservedV2装饰的复杂对象,不仅仅是简单值
  • 工厂函数:支持初始化工厂函数,延迟创建实例
  • 响应式增强:与@Trace/@ObservedV2深度集成,实现细粒度响应式更新

2.2 connect方法

AppStorageV2的核心API是connect方法,用于连接一个全局状态实例:

AppStorageV2.connect<ApprovalStore>(ApprovalStore, () => new ApprovalStore())

connect方法接收两个参数:

  • 类引用:要连接的类类型
  • 工厂函数:创建实例的工厂函数(可选)

返回值是类的实例,如果全局已存在则返回现有实例,否则通过工厂函数创建新实例。

三、AppStorageV2在项目中的应用

3.1 审批状态仓库的连接

在"星办OA"项目中,所有需要审批数据的页面都通过AppStorageV2连接同一个ApprovalStore实例:

审批中心(OfficePage.ets):

@ComponentV2
export struct OfficePage {
  @Local store: ApprovalStore = AppStorageV2.connect<ApprovalStore>(
    ApprovalStore, () => new ApprovalStore()
  )!
  @Local selectedView: string = ApprovalView.PENDING
  @Local selectedType: string = '全部'
  @Local keyword: string = ''
  @Consumer('pageInfos') pageInfos: NavPathStack = new NavPathStack()
}

工作台(Home.ets):

@ComponentV2
export struct HomePage {
  @Local store: ApprovalStore = AppStorageV2.connect<ApprovalStore>(
    ApprovalStore, () => new ApprovalStore()
  )!
  @Consumer('pageInfos') pageInfos: NavPathStack = new NavPathStack()
}

消息中心(InteractionPage.ets):

@ComponentV2
export struct InteractionPage {
  @Local store: ApprovalStore = AppStorageV2.connect<ApprovalStore>(
    ApprovalStore, () => new ApprovalStore()
  )!
  @Local selectedCategory: string = '全部'
  @Consumer('pageInfos') pageInfos: NavPathStack = new NavPathStack()
}

个人中心(MinePage.ets):

@ComponentV2
export struct MinePage {
  @Local store: ApprovalStore = AppStorageV2.connect<ApprovalStore>(
    ApprovalStore, () => new ApprovalStore()
  )!
  @Local approvalNotificationEnabled: boolean = true
  @Local resultNotificationEnabled: boolean = true
}

审批详情页(ApprovalDetailPage.ets):

@ComponentV2
export struct ApprovalDetailPage {
  @Param approvalId: string = ''
  @Local store: ApprovalStore = AppStorageV2.connect<ApprovalStore>(
    ApprovalStore, () => new ApprovalStore()
  )!
  @Local approval: ApprovalRequest = new ApprovalRequest()
  @Local found: boolean = false
  @Local comment: string = ''
}

审批创建页(ApprovalCreatePage.ets):

@ComponentV2
export struct ApprovalCreatePage {
  @Param approvalType: string = '请假'
  @Local store: ApprovalStore = AppStorageV2.connect<ApprovalStore>(
    ApprovalStore, () => new ApprovalStore()
  )!
  @Local selectedType: string = '请假'
  @Local title: string = ''
  @Local summary: string = ''
  @Local reason: string = ''
}

3.2 单例共享机制

关键点在于:虽然每个页面都调用了AppStorageV2.connect<ApprovalStore>(),但所有页面连接的是同一个实例。AppStorageV2内部维护了一个全局实例注册表,当第一次调用connect时,通过工厂函数创建实例并注册;后续的connect调用直接返回已注册的实例。

这种机制确保了:

  • 数据一致性:所有页面共享同一份审批数据
  • 状态同步:一个页面修改数据后,其他页面自动感知变化
  • 内存效率:只有一个实例驻留在内存中

四、AppStorageV2与AppStorage对比

4.1 功能对比

特性 AppStorage AppStorageV2

存储类型 简单值 复杂对象
类型安全 弱(返回值需手动转换) 强(泛型参数)
连接方式 get/set API connect方法
对象支持 不直接支持 支持@ObservedV2对象
响应式 值级别 属性级别(配合@Trace)
工厂函数 不支持 支持
使用场景 系统参数 业务状态

4.2 使用场景划分

在"星办OA"项目中,两者的使用场景有明确分工:

AppStorage用于系统级参数:

AppStorage.get('topRectHeight')  // 顶部安全区域高度
AppStorage.get('bottomRectHeight')  // 底部安全区域高度

AppStorageV2用于业务状态:

AppStorageV2.connect<ApprovalStore>(ApprovalStore, () => new ApprovalStore())

五、AppStorageV2的响应式机制

5.1 与@Trace/@ObservedV2的配合

AppStorageV2的响应式能力依赖于@ObservedV2和@Trace装饰器。被连接的类需要标记为@ObservedV2,其中的属性需要标记为@Trace:

@ObservedV2
export class ApprovalStore {
  @Trace approvals: ApprovalRequest[] = createDemoApprovals()
  @Trace messages: ApprovalMessage[] = createDemoMessages()
  @Trace profile: EmployeeProfile = new EmployeeProfile()
  // ...
}

当@Trace属性的值发生变化时,AppStorageV2会通知所有连接的组件进行更新。

5.2 更新触发机制

在ApprovalStore中,每个修改方法都通过重新赋值触发响应式更新:

submit(type: string, title: string, summary: string, reason: string): ApprovalMutation {
  let result: ApprovalMutation = submitApproval(this.approvals, input, id, '刚刚')
  if (result.success) {
    this.approvals = result.approvals  // 重新赋值触发更新
    this.addActionMessage(result, '申请已提交', `${type}申请已进入审批流程。`)
  }
  return result
}

关键模式:this.approvals = result.approvals。这里不是修改数组内容,而是将整个数组替换为新数组,从而触发@Trace的变更检测。

六、AppStorageV2的优势

6.1 类型安全

AppStorageV2通过泛型提供了编译时的类型检查:

// 类型安全:store的类型被明确为ApprovalStore
@Local store: ApprovalStore = AppStorageV2.connect<ApprovalStore>(ApprovalStore, () => new ApprovalStore())!

编译器可以校验store上调用的方法是否存在于ApprovalStore类中,避免了运行时错误。

6.2 延迟初始化

工厂函数() => new ApprovalStore()在第一次调用connect时执行,后续不再执行。这种延迟初始化机制确保了:

  • 实例在使用前不会被创建
  • 避免了不必要的内存分配
  • 工厂函数可以包含复杂的初始化逻辑

6.3 跨页面同步

AppStorageV2最强大的能力是跨页面状态同步。在审批详情页中执行同意操作后:

this.store.approve(this.approval.id, this.comment)

工作台首页的统计数字会立即更新,审批中心列表中的状态也会同步变化,所有页面都不需要手动刷新或通信。

七、工厂函数模式

7.1 统一工厂函数

在"星办OA"项目中,所有页面使用相同的工厂函数:

() => new ApprovalStore()

这种模式确保了:

  • 实例唯一性:工厂函数只在第一次调用时执行
  • 初始化一致性:不论从哪个页面首次访问,都使用相同的初始化逻辑

7.2 命名连接

AppStorageV2还支持命名连接,允许多个不同类型的实例:

// 默认连接(使用类名作为键)
AppStorageV2.connect<ApprovalStore>(ApprovalStore, () => new ApprovalStore())

// 命名连接(使用自定义键名)
AppStorageV2.connect<ApprovalStore>(ApprovalStore, 'CustomStore', () => new ApprovalStore())

在"星办OA"项目中,所有的connect调用都使用默认连接(不指定键名),这意味着所有页面连接的是同一个ApprovalStore实例。

八、总结

AppStorageV2是HarmonyOS NEXT中新一代的应用级状态管理机制。通过类型安全的connect方法、工厂函数模式、与@ObservedV2/@Trace的深度集成,为复杂业务状态管理提供了强大的支持。

在"星办OA"项目中,AppStorageV2被用于连接ApprovalStore审批状态仓库,实现了审批数据、消息数据、员工信息在六个页面之间的共享和同步。所有页面通过相同的connect调用获取同一个实例,任何页面的数据修改都会自动同步到其他页面,无需手动刷新或事件通信。

AppStorageV2与AppStorage形成了明确的分工:AppStorage负责系统级参数管理,AppStorageV2负责业务状态管理。这种分层设计,使得企业级应用的状态管理既清晰又高效。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐