Pinia 的 getters 缓存由 Vue 3 响应式系统实现,依赖追踪+脏检查+惰性求值协同工作;仅读取可响应式数据时才收集依赖,变化后仅在下次访问时重新计算,与 Vue computed 行为完全一致。

Pinia 的 getters(本质是 Vue 的 computed)缓存机制,底层触发逻辑完全依赖 Vue 3 的响应式系统,不是靠轮询或手动通知,而是靠依赖追踪 + 脏检查 + 惰性求值三者协同完成。
缓存的前提:依赖必须可被追踪
只有当你在 getter 函数中读取了响应式数据(如 state.count、ref.value、store.otherGetter),Vue 才会在首次计算时自动收集这些依赖。
如果读取的是普通变量、字面量、未包裹对象或解构失活的 props,就无法进入依赖图,后续修改不会触发更新,缓存也不会失效。
-
state是用reactive()或ref()创建的 → 属性访问会被 Proxy 拦截并 track -
getters内部调用其他 getter → 形成嵌套依赖链,也会被一并收集 - 使用
storeToRefs(store)解构后访问.value→ 仍保持响应式连接,可正常触发
触发更新的关键环节:track → trigger → dirty → re-evaluate
-
首次访问 getter:执行函数体,同时开启依赖收集(track),记录所有读取的响应式属性(比如
state.items.length、user.name) -
某个依赖变化(如
state.items.push(newItem)):Proxy 的trigger机制通知所有订阅该 key 的 computed 标记为「脏」(dirty) - 下次访问该 getter:发现是 dirty 状态,才重新执行函数、更新缓存值;否则直接返回上一次结果
注意:getter 不会“立刻重算”,只在被读取时惰性更新。即使依赖变了十次,只要没人访问它,就不会执行。
和普通 computed 完全一致,只是运行在 store 上
Pinia 的 getter 就是用 computed(() => {}) 实现的,它返回一个 ref-like 对象(但 store 内部做了 .value 自动解包,所以模板里直接写 store.myGetter 即可)。它的缓存行为与 <script setup> 中的 computed(() => ...) 完全相同——共享同一套 Vue 运行时逻辑。
- 缓存值存储在 getter 的内部 effect 实例中
- 多个组件读取同一个 getter,共用一份缓存(非组件实例级隔离)
- 若 getter 含副作用(如 console.log),仅在真正需要刷新时执行,不会因无关响应式变化误触发
本质上,Pinia 没有自己实现缓存,它把这件事完整交给了 Vue 的 computed。你写的每个 getter,都是一个挂载在 store 实例上的、受 Vue 响应式引擎调度的派生计算节点。
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xitongjiaocheng/37441.html