pinia 的 $subscribe 是监听 store 状态变化最直接、最轻量的方式,它通过回调函数接收 mutation 和 state 参数,在状态变更时自动触发,支持按类型或字段过滤,并可通过 flush 配置执行时机,配合 watch 可实现更精细的响应式监听。

Pinia 的 $subscribe 是监听 store 状态变化最直接、最轻量的方式,它不是事件总线,但能自然实现跨组件响应——只要它们共用同一个 store。
监听状态变更的基本写法
在组件 setup 或 onMounted 中调用 store 实例的 $subscribe 方法,传入回调函数即可:
- 回调接收两个参数:
mutation(含变更类型、storeId、payload)和state(当前完整状态快照) - 每次 state 被修改(如通过 action、直接赋值或 patch),只要触发了响应式更新,就会触发订阅
- 组件卸载时自动解绑,无需手动清理(除非你显式保存了返回的取消函数)
只关注特定字段或动作类型
不必每次都响应全部变更,可通过判断 mutation.type 或检查 payload 内容来过滤:
-
mutation.type === 'direct'表示直接修改 state 字段(如store.count = 5) -
mutation.type === 'patchObject'对应store.$patch({ count: 6 }) - 若只关心某个字段(比如
user.token),可在回调里加条件判断:if (mutation.payload?.token !== undefined)
控制执行时机:sync / pre / post
第三个参数可传配置对象,指定回调执行时机:
-
{ flush: 'sync' }:状态一变立刻执行,适合同步副作用(如存 localStorage) -
{ flush: 'pre' }:在 DOM 更新前执行,适合提前准备数据 -
{ flush: 'post' }(默认):DOM 渲染完成后执行,适合操作 DOM 元素(如 focus 输入框)
配合 watch 做更精细的响应
当需要监听嵌套属性或计算值时,$subscribe 不够精准,这时推荐用 watch:
- 监听
() => store.user.profile.name,支持 deep 和 immediate - 避免在 watch 回调中直接改同一 store 字段,防止无限循环
- 适合 UI 同步类场景,比如搜索关键词变,列表立刻刷新
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










