diff --git a/packages/reactivity/__tests__/ref.spec.ts b/packages/reactivity/__tests__/ref.spec.ts index 9ef6c4e4b15..883af0f874b 100644 --- a/packages/reactivity/__tests__/ref.spec.ts +++ b/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') }) diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index 64d9f1073ae..6596ecddb01 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -168,7 +168,9 @@ export function toRef( object: T, key: K ): Ref { - 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