From bb7fa3dabce73de63d016c75f1477e7d8bed8858 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 12 Mar 2020 16:13:12 -0400 Subject: [PATCH] feat(runtime-core): implement RFC-0020 BREAKING CHANGE: data no longer supports object format (per RFC-0020) --- packages/runtime-core/__tests__/apiOptions.spec.ts | 12 ++++++------ packages/runtime-core/src/apiOptions.ts | 10 ++++++++-- packages/vue/__tests__/index.spec.ts | 4 ++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/packages/runtime-core/__tests__/apiOptions.spec.ts b/packages/runtime-core/__tests__/apiOptions.spec.ts index 36f3617401a..836373c7053 100644 --- a/packages/runtime-core/__tests__/apiOptions.spec.ts +++ b/packages/runtime-core/__tests__/apiOptions.spec.ts @@ -634,9 +634,9 @@ describe('api: options', () => { test('data property is already declared in props', () => { const Comp = { props: { foo: Number }, - data: { + data: () => ({ foo: 1 - }, + }), render() {} } @@ -649,9 +649,9 @@ describe('api: options', () => { test('computed property is already declared in data', () => { const Comp = { - data: { + data: () => ({ foo: 1 - }, + }), computed: { foo() {} }, @@ -699,9 +699,9 @@ describe('api: options', () => { test('methods property is already declared in data', () => { const Comp = { - data: { + data: () => ({ foo: 2 - }, + }), methods: { foo() {} }, diff --git a/packages/runtime-core/src/apiOptions.ts b/packages/runtime-core/src/apiOptions.ts index ab0749f72e1..8769ec30dbd 100644 --- a/packages/runtime-core/src/apiOptions.ts +++ b/packages/runtime-core/src/apiOptions.ts @@ -167,7 +167,7 @@ export interface LegacyOptions< // Limitation: we cannot expose RawBindings on the `this` context for data // since that leads to some sort of circular inference and breaks ThisType // for the entire component. - data?: D | ((this: ComponentPublicInstance) => D) + data?: (this: ComponentPublicInstance) => D computed?: C methods?: M watch?: ComponentWatchOptions @@ -280,7 +280,13 @@ export function applyOptions( // state options if (dataOptions) { - const data = isFunction(dataOptions) ? dataOptions.call(ctx) : dataOptions + if (__DEV__ && !isFunction(dataOptions)) { + warn( + `The data option must be a function. ` + + `Plain object usage is no longer supported.` + ) + } + const data = dataOptions.call(ctx) if (!isObject(data)) { __DEV__ && warn(`data() should return an object.`) } else if (instance.data === EMPTY_OBJ) { diff --git a/packages/vue/__tests__/index.spec.ts b/packages/vue/__tests__/index.spec.ts index 3bde76341e8..eb38d9d1868 100644 --- a/packages/vue/__tests__/index.spec.ts +++ b/packages/vue/__tests__/index.spec.ts @@ -89,9 +89,9 @@ describe('compiler + runtime integration', () => { it('should support using element innerHTML as template', () => { const app = createApp({ - data: { + data: () => ({ msg: 'hello' - } + }) }) const container = document.createElement('div') container.innerHTML = '{{msg}}'