]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(reactivity): replaced ref in reactive object should be tracked (#1058)
authorYang Mingshan <y.mingshan3@gmail.com>
Fri, 12 Jun 2020 13:20:43 +0000 (21:20 +0800)
committerGitHub <noreply@github.com>
Fri, 12 Jun 2020 13:20:43 +0000 (09:20 -0400)
packages/reactivity/__tests__/reactive.spec.ts
packages/reactivity/src/baseHandlers.ts

index cbc8c871cea7eb993ed0a93b974464d2b001209f..8020bbf84c6257bb0660fc01ed269507d620c0a3 100644 (file)
@@ -131,6 +131,21 @@ describe('reactivity/reactive', () => {
     expect(typeof obj.b).toBe(`number`)
   })
 
+  test('should allow setting property from a ref to another ref', () => {
+    const foo = ref(0)
+    const bar = ref(1)
+    const observed = reactive({ a: foo })
+    const dummy = computed(() => observed.a)
+    expect(dummy.value).toBe(0)
+
+    // @ts-ignore
+    observed.a = bar
+    expect(dummy.value).toBe(1)
+
+    bar.value++
+    expect(dummy.value).toBe(2)
+  })
+
   test('non-observable values', () => {
     const assertValue = (value: any) => {
       reactive(value)
index f8452a35d85b2f683877ac2b6ab89838559ad276..65838c1305f69924723e4e096d8718d781e30684 100644 (file)
@@ -66,14 +66,14 @@ function createGetter(isReadonly = false, shallow = false) {
       return res
     }
 
+    !isReadonly && track(target, TrackOpTypes.GET, key)
+
     if (shallow) {
-      !isReadonly && track(target, TrackOpTypes.GET, key)
       return res
     }
 
     if (isRef(res)) {
       if (targetIsArray) {
-        !isReadonly && track(target, TrackOpTypes.GET, key)
         return res
       } else {
         // ref unwrapping, only for Objects, not for Arrays.
@@ -81,7 +81,6 @@ function createGetter(isReadonly = false, shallow = false) {
       }
     }
 
-    !isReadonly && track(target, TrackOpTypes.GET, key)
     return isObject(res)
       ? isReadonly
         ? // need to lazy access readonly and reactive here to avoid