Action 运行时迁移

解构式 defineStore API、命名 Hook 与 getStore、createPinia() 和原有函数 patch 继续可用。新应用可以采用 PiniaProvider,普通 React 应用也可以保留原有 activePinia 初始化。

行为 原运行时 当前运行时
多次同步赋值 通常由一个 Action Draft 提交 每次真实赋值分别提交
await 前后修改 Draft 生命周期不同 稳定的修改代理,读取最新状态
嵌套 Action 外层 Draft 可能覆盖内层修改 每个 Action 独立提交
Action 失败 同步 Draft 修改可能回滚 保留已经提交的修改
数组可变方法 可能受到 Draft 生命周期影响 每次方法调用作为一次逻辑提交
订阅回调 两个状态参数 增加可选的第三个 MutationEvent 参数

需要同步原子更新时使用 $patch(fn),浅层批量替换顶层字段时使用 $patch(object)。patch 回调抛错不会提交其草稿修改。Action 本身没有隐式事务或异步回滚,请在 finally 中恢复标志,或显式实现业务恢复。

插件和 DevTools 会接收每次真实提交。可以通过可选的 actionId 和 parentActionId 关联事件,不要依赖其字符串格式。Action 内的 patch 事件类型仍是 patch。仅 Getter 依赖失效不会触发状态订阅。

受支持的响应式模型为普通对象和数组。特殊对象保留原生读取兼容,但内部修改不被追踪;通过 Action/patch 替换整个值,或使用普通数据。SSR 快照必须可安全序列化为 JSON。快照、根 Provider 生命周期和客户端 getStore 的边界见 Next.js App Router。

显式实例与清理

单根客户端仍可使用原有无参访问函数。多个实例并存时,在应用边界保留 Pinia,服务中在 await 前后都使用 getStore(pinia)。PiniaProvider pinia={pinia} 复用现有实例,不要再同时传入 Provider 插件或快照。普通访问函数不读取 React Context,Action 也不自动传播异步实例上下文。

当前 core 为插件提供可选的 context.onDispose,旧宿主和手写 context 可以不提供。取得资源前检查该能力,或另行保留清理责任。应用最终持有者先卸载组件,再调用 disposePinia(pinia)。销毁不可逆、不删除持久化数据,也不会在 Provider 卸载时自动执行。见实例生命周期和插件清理。