按需持久化需区分用户意图型状态(如暗黑模式、表单数据)与交互瞬态型状态(如光标位置、弹窗标记),仅用@Trace标记需落盘字段,并通过拆分状态类、使用globalConnect等方式精准控制持久化范围。

按需持久化不是“全存”或“不存”的二选一,而是明确哪些状态值得落盘、哪些该留在内存里——关键在识别和隔离。
区分 UI 状态的两类本质属性
UI 状态不是铁板一块,得拆开看:
- 用户意图型状态:反映用户主动选择或长期偏好,比如暗黑模式开关、默认语言、表单已填写的姓名/邮箱、最近搜索关键词。这类数据关掉 App 再打开仍应保持,属于“值得持久化”的核心状态。
- 交互瞬态型状态:仅服务于当前操作流程,比如弹窗的临时展开标记、列表滚动位置(除非用户明确“记住位置”)、输入框的光标位置、按钮加载中的 pending 标志。这些状态重启后不仅无意义,还可能干扰新流程,应严格排除在持久化之外。
用 @Trace 精准标记可持久字段
PersistenceV2 的自动持久化只响应被 @Trace 修饰的属性。没加这个装饰器,改了也不会写入磁盘——这是最直接的“按需”开关。
例如:
@ObservedV2
class FormState {
@Trace userName: string = ""; // ✅ 用户填的姓名,需持久
@Trace isSubmitted: boolean = false; // ✅ 提交完成状态,需持久
showHint: boolean = false; // ❌ 仅用于当前输入提示,不加 @Trace
cursorPosition: number = 0; // ❌ 光标位置,纯瞬态,不加
}
注意:所有被 PersistenceV2 持久化的类属性必须有初始值,否则框架会跳过该字段。
避免把整个对象当“黑盒”连过去
别图省事写 PersistenceV2.connect(WholePageState, ...) 然后给所有字段都加 @Trace。这等于把临时状态也打包塞进磁盘。
更稳妥的做法是:
- 为不同用途拆分状态类:一个专管用户设置(Settings),一个管页面临时交互(PageTemp);
- 只对 Settings 类调用
connect; - PageTemp 类完全不用 PersistenceV2,靠
@Local或@State在组件内管理; - 必要时用
PersistenceV2.save(Settings)手动触发,而非依赖自动同步。
用 globalConnect 替代 connect 控制作用域
如果你的应用含多个模块(module),且某些 UI 状态只在特定模块内有意义,优先用 globalConnect(API version 23+)。
它把数据存在应用级路径,避免 module 级别的 connect 造成重复键冲突或跨模块误读。更重要的是,你可以在每个模块中只连接自己真正需要的状态子集,而不是把整个全局状态树都拉进来。
比如登录模块只需持久化 token 和用户 ID,就只 globalConnect(AuthState, ...);设置模块则单独 globalConnect(ThemeState, ...)——彼此隔离,互不污染。

















