Skip to content

Commit 67d3109

Browse files
committed
fix: avoid immediate computing with storeToRefs
Fix #2812
1 parent ea14e53 commit 67d3109

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

packages/pinia/__tests__/storeToRefs.spec.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { describe, beforeEach, it, expect } from 'vitest'
1+
import { describe, beforeEach, it, expect, vi } from 'vitest'
22
import { computed, reactive, ref, ToRefs } from 'vue'
33
import { createPinia, defineStore, setActivePinia, storeToRefs } from '../src'
44
import { set } from 'vue-demi'
@@ -190,6 +190,19 @@ describe('storeToRefs', () => {
190190
expect(double.value).toEqual(1)
191191
})
192192

193+
it('does not trigger getters', () => {
194+
const n = ref(0)
195+
const spy = vi.fn(() => n.value * 2)
196+
const store = defineStore('a', () => {
197+
const double = computed(spy)
198+
return { n, double }
199+
})()
200+
201+
expect(spy).toHaveBeenCalledTimes(0)
202+
storeToRefs(store)
203+
expect(spy).toHaveBeenCalledTimes(0)
204+
})
205+
193206
tds(() => {
194207
const store1 = defineStore('a', () => {
195208
const n = ref(0)

packages/pinia/src/storeToRefs.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {
2+
computed,
23
ComputedRef,
34
isReactive,
45
isRef,
@@ -99,7 +100,19 @@ export function storeToRefs<SS extends StoreGeneric>(
99100
const refs = {} as StoreToRefs<SS>
100101
for (const key in rawStore) {
101102
const value = rawStore[key]
102-
if (isRef(value) || isReactive(value)) {
103+
// There is no native method to check for a computed
104+
// https://github.com/vuejs/core/pull/4165
105+
if (value.effect) {
106+
// @ts-expect-error: too hard to type correctly
107+
refs[key] =
108+
// ...
109+
computed({
110+
get: () => store[key],
111+
set(value) {
112+
store[key] = value
113+
},
114+
})
115+
} else if (isRef(value) || isReactive(value)) {
103116
// @ts-expect-error: the key is state or getter
104117
refs[key] =
105118
// ---

0 commit comments

Comments
 (0)