Browse Source

fix(reactivity): `toRef` should not wrap a `ref` (#2103)

Carlos Rodrigues 5 years ago
parent
commit
d4bf9bcbb4
2 changed files with 10 additions and 4 deletions
  1. 7 3
      packages/reactivity/__tests__/ref.spec.ts
  2. 3 1
      packages/reactivity/src/ref.ts

+ 7 - 3
packages/reactivity/__tests__/ref.spec.ts

@@ -236,6 +236,10 @@ describe('reactivity/ref', () => {
     // mutating source should trigger effect using the proxy refs
     a.x = 4
     expect(dummyX).toBe(4)
+
+    // should keep ref
+    const r = { x: ref(1) }
+    expect(toRef(r, 'x')).toBe(r.x)
   })
 
   test('toRefs', () => {
@@ -292,12 +296,12 @@ describe('reactivity/ref', () => {
   test('toRefs reactive array', () => {
     const arr = reactive(['a', 'b', 'c'])
     const refs = toRefs(arr)
-    
+
     expect(Array.isArray(refs)).toBe(true)
-    
+
     refs[0].value = '1'
     expect(arr[0]).toBe('1')
-    
+
     arr[1] = '2'
     expect(refs[1].value).toBe('2')
   })

+ 3 - 1
packages/reactivity/src/ref.ts

@@ -168,7 +168,9 @@ export function toRef<T extends object, K extends keyof T>(
   object: T,
   key: K
 ): Ref<T[K]> {
-  return new ObjectRefImpl(object, key) as any
+  return isRef(object[key])
+    ? object[key]
+    : (new ObjectRefImpl(object, key) as any)
 }
 
 // corner case when use narrows type