]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
feat(reactivity): return array when calling `toRefs` on array (#1768)
authorJordan Pittman <jordan@cryptica.me>
Tue, 18 Aug 2020 16:11:13 +0000 (12:11 -0400)
committerGitHub <noreply@github.com>
Tue, 18 Aug 2020 16:11:13 +0000 (12:11 -0400)
close #1764

packages/reactivity/__tests__/ref.spec.ts
packages/reactivity/src/ref.ts

index 6bfcceaef541b5a8fb21d465bff43fcd8910d364..bae4ec35a3192d080e5958bf15540e3942fdfe80 100644 (file)
@@ -266,12 +266,29 @@ describe('reactivity/ref', () => {
     expect(dummyY).toBe(5)
   })
 
-  test('toRefs pass a reactivity object', () => {
-    console.warn = jest.fn()
-    const obj = { x: 1 }
-    toRefs(obj)
-    expect(console.warn).toBeCalled()
+  test('toRefs should warn on plain object', () => {
+    toRefs({})
+    expect(`toRefs() expects a reactive object`).toHaveBeenWarned()
   })
+
+  test('toRefs should warn on plain array', () => {
+    toRefs([])
+    expect(`toRefs() expects a reactive object`).toHaveBeenWarned()
+  })
+
+  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')
+  })
+
   test('customRef', () => {
     let value = 1
     let _trigger: () => void
index 174494e87e96b0e1077da24d909dbc61f88ff379..396e34e47d5f11cb95bede5892cf387ff3a32c4e 100644 (file)
@@ -1,6 +1,6 @@
 import { track, trigger } from './effect'
 import { TrackOpTypes, TriggerOpTypes } from './operations'
-import { isObject, hasChanged } from '@vue/shared'
+import { isArray, isObject, hasChanged } from '@vue/shared'
 import { reactive, isProxy, toRaw, isReactive } from './reactive'
 import { CollectionTypes } from './collectionHandlers'
 
@@ -121,7 +121,7 @@ export function toRefs<T extends object>(object: T): ToRefs<T> {
   if (__DEV__ && !isProxy(object)) {
     console.warn(`toRefs() expects a reactive object but received a plain one.`)
   }
-  const ret: any = {}
+  const ret: any = isArray(object) ? new Array(object.length) : {}
   for (const key in object) {
     ret[key] = toRef(object, key)
   }