]> git.ipfire.org Git - thirdparty/vuejs/pinia.git/commitdiff
fix: reference the store directly in storeToRefs to ensure correct reactivity after...
authorbabu-ch <42715882+babu-ch@users.noreply.github.com>
Thu, 17 Oct 2024 03:09:34 +0000 (12:09 +0900)
committerGitHub <noreply@github.com>
Thu, 17 Oct 2024 03:09:34 +0000 (12:09 +0900)
packages/pinia/__tests__/storeToRefs.spec.ts
packages/pinia/src/storeToRefs.ts

index d7e6a5f2f6ceadb76cfb39c2587d0341d4af8740..d1110e8c131a4675dd7b43bbc88a600041a23740 100644 (file)
@@ -1,6 +1,7 @@
 import { describe, beforeEach, it, expect } from 'vitest'
 import { computed, reactive, ref, ToRefs } from 'vue'
 import { createPinia, defineStore, setActivePinia, storeToRefs } from '../src'
+import { set } from 'vue-demi'
 
 describe('storeToRefs', () => {
   beforeEach(() => {
@@ -170,6 +171,25 @@ describe('storeToRefs', () => {
     expect(refs.n.value).toBe(2)
   })
 
+  it('keep reactivity', () => {
+    const store = defineStore('a', () => {
+      const n = ref(0)
+      const double = computed(() => n.value * 2)
+      return { n, double }
+    })()
+
+    const { double } = storeToRefs(store)
+
+    // Assuming HMR operation
+    set(
+      store,
+      'double',
+      computed(() => 1)
+    )
+
+    expect(double.value).toEqual(1)
+  })
+
   tds(() => {
     const store1 = defineStore('a', () => {
       const n = ref(0)
index 9e5dab0e4b30179fe2ecda9b7d3cdaadbfdf450e..3a1cec09f5a65feda11dca02c7b69a37fa1c520f 100644 (file)
@@ -94,11 +94,11 @@ export function storeToRefs<SS extends StoreGeneric>(
     // @ts-expect-error: toRefs include methods and others
     return toRefs(store)
   } else {
-    store = toRaw(store)
+    const rawStore = toRaw(store)
 
     const refs = {} as StoreToRefs<SS>
-    for (const key in store) {
-      const value = store[key]
+    for (const key in rawStore) {
+      const value = rawStore[key]
       if (isRef(value) || isReactive(value)) {
         // @ts-expect-error: the key is state or getter
         refs[key] =