From: Jordan Pittman Date: Tue, 18 Aug 2020 16:11:13 +0000 (-0400) Subject: feat(reactivity): return array when calling `toRefs` on array (#1768) X-Git-Tag: v3.0.0-rc.6~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4172fdb90cd75d5741f843a227cfe9b5f5b22b35;p=thirdparty%2Fvuejs%2Fcore.git feat(reactivity): return array when calling `toRefs` on array (#1768) close #1764 --- diff --git a/packages/reactivity/__tests__/ref.spec.ts b/packages/reactivity/__tests__/ref.spec.ts index 6bfcceaef5..bae4ec35a3 100644 --- a/packages/reactivity/__tests__/ref.spec.ts +++ b/packages/reactivity/__tests__/ref.spec.ts @@ -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 diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index 174494e87e..396e34e47d 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -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(object: T): ToRefs { 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) }