From d87255ce46373cc12fa4ed175b6787007b6470a0 Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 2 Oct 2019 10:03:43 -0400 Subject: [PATCH] fix(options): data options should preserve original object if possible --- packages/runtime-core/src/apiApp.ts | 4 ++-- packages/runtime-core/src/apiCreateComponent.ts | 4 ++-- packages/runtime-core/src/apiLifecycle.ts | 2 +- .../src/{componentOptions.ts => apiOptions.ts} | 17 +++++++++++------ packages/runtime-core/src/component.ts | 4 ++-- ...PublicInstanceProxy.ts => componentProxy.ts} | 2 +- packages/runtime-core/src/createRenderer.ts | 2 +- packages/runtime-core/src/directives.ts | 2 +- packages/runtime-core/src/h.ts | 2 +- packages/runtime-core/src/index.ts | 4 ++-- 10 files changed, 24 insertions(+), 19 deletions(-) rename packages/runtime-core/src/{componentOptions.ts => apiOptions.ts} (95%) rename packages/runtime-core/src/{componentPublicInstanceProxy.ts => componentProxy.ts} (98%) diff --git a/packages/runtime-core/src/apiApp.ts b/packages/runtime-core/src/apiApp.ts index 6a932822..584362be 100644 --- a/packages/runtime-core/src/apiApp.ts +++ b/packages/runtime-core/src/apiApp.ts @@ -1,6 +1,6 @@ import { Component, Data, ComponentInternalInstance } from './component' -import { ComponentOptions } from './componentOptions' -import { ComponentPublicInstance } from './componentPublicInstanceProxy' +import { ComponentOptions } from './apiOptions' +import { ComponentPublicInstance } from './componentProxy' import { Directive } from './directives' import { RootRenderFunction } from './createRenderer' import { InjectionKey } from './apiInject' diff --git a/packages/runtime-core/src/apiCreateComponent.ts b/packages/runtime-core/src/apiCreateComponent.ts index a35ea766..45a3ca6d 100644 --- a/packages/runtime-core/src/apiCreateComponent.ts +++ b/packages/runtime-core/src/apiCreateComponent.ts @@ -4,10 +4,10 @@ import { ComponentOptionsWithoutProps, ComponentOptionsWithArrayProps, ComponentOptionsWithProps -} from './componentOptions' +} from './apiOptions' import { SetupContext } from './component' import { VNodeChild } from './vnode' -import { ComponentPublicInstance } from './componentPublicInstanceProxy' +import { ComponentPublicInstance } from './componentProxy' import { ExtractPropTypes } from './componentProps' import { isFunction } from '@vue/shared' diff --git a/packages/runtime-core/src/apiLifecycle.ts b/packages/runtime-core/src/apiLifecycle.ts index 39782388..833d902c 100644 --- a/packages/runtime-core/src/apiLifecycle.ts +++ b/packages/runtime-core/src/apiLifecycle.ts @@ -4,7 +4,7 @@ import { currentInstance, setCurrentInstance } from './component' -import { ComponentPublicInstance } from './componentPublicInstanceProxy' +import { ComponentPublicInstance } from './componentProxy' import { callWithAsyncErrorHandling, ErrorTypeStrings } from './errorHandling' import { warn } from './warning' import { capitalize } from '@vue/shared' diff --git a/packages/runtime-core/src/componentOptions.ts b/packages/runtime-core/src/apiOptions.ts similarity index 95% rename from packages/runtime-core/src/componentOptions.ts rename to packages/runtime-core/src/apiOptions.ts index 9ee96ed6..8f8582e3 100644 --- a/packages/runtime-core/src/componentOptions.ts +++ b/packages/runtime-core/src/apiOptions.ts @@ -30,7 +30,8 @@ import { DebuggerEvent, reactive } from '@vue/reactivity' import { ComponentPropsOptions, ExtractPropTypes } from './componentProps' import { Directive } from './directives' import { VNodeChild } from './vnode' -import { ComponentPublicInstance } from './componentPublicInstanceProxy' +import { ComponentPublicInstance } from './componentProxy' +import { warn } from './warning' interface ComponentOptionsBase< Props, @@ -231,11 +232,15 @@ export function applyOptions( // state options if (dataOptions) { - const data = - instance.data === EMPTY_OBJ - ? (instance.data = reactive({})) - : instance.data - extend(data, isFunction(dataOptions) ? dataOptions.call(ctx) : dataOptions) + const data = isFunction(dataOptions) ? dataOptions.call(ctx) : dataOptions + if (!isObject(data)) { + __DEV__ && warn(`data() should return an object.`) + } else if (instance.data === EMPTY_OBJ) { + instance.data = reactive(data) + } else { + // existing data: this is a mixin or extends. + extend(instance.data, data) + } } if (computedOptions) { for (const key in computedOptions) { diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index d99a636f..570092dc 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -3,7 +3,7 @@ import { ReactiveEffect, reactive, readonly } from '@vue/reactivity' import { PublicInstanceProxyHandlers, ComponentPublicInstance -} from './componentPublicInstanceProxy' +} from './componentProxy' import { ComponentPropsOptions } from './componentProps' import { Slots } from './componentSlots' import { warn } from './warning' @@ -14,7 +14,7 @@ import { } from './errorHandling' import { AppContext, createAppContext } from './apiApp' import { Directive } from './directives' -import { applyOptions, ComponentOptions } from './componentOptions' +import { applyOptions, ComponentOptions } from './apiOptions' import { EMPTY_OBJ, isFunction, diff --git a/packages/runtime-core/src/componentPublicInstanceProxy.ts b/packages/runtime-core/src/componentProxy.ts similarity index 98% rename from packages/runtime-core/src/componentPublicInstanceProxy.ts rename to packages/runtime-core/src/componentProxy.ts index 5741eaed..05f78428 100644 --- a/packages/runtime-core/src/componentPublicInstanceProxy.ts +++ b/packages/runtime-core/src/componentProxy.ts @@ -2,7 +2,7 @@ import { ComponentInternalInstance, Data } from './component' import { nextTick } from './scheduler' import { instanceWatch } from './apiWatch' import { EMPTY_OBJ, hasOwn } from '@vue/shared' -import { ExtracComputedReturns } from './componentOptions' +import { ExtracComputedReturns } from './apiOptions' import { UnwrapRef } from '@vue/reactivity' // public properties exposed on the proxy, which is used as the render context diff --git a/packages/runtime-core/src/createRenderer.ts b/packages/runtime-core/src/createRenderer.ts index 945a8b8e..4fc55aed 100644 --- a/packages/runtime-core/src/createRenderer.ts +++ b/packages/runtime-core/src/createRenderer.ts @@ -42,7 +42,7 @@ import { resolveSlots } from './componentSlots' import { ShapeFlags } from './shapeFlags' import { pushWarningContext, popWarningContext, warn } from './warning' import { invokeDirectiveHook } from './directives' -import { ComponentPublicInstance } from './componentPublicInstanceProxy' +import { ComponentPublicInstance } from './componentProxy' import { App, createAppAPI } from './apiApp' import { SuspenseBoundary, diff --git a/packages/runtime-core/src/directives.ts b/packages/runtime-core/src/directives.ts index 2119bec9..39aa7d6e 100644 --- a/packages/runtime-core/src/directives.ts +++ b/packages/runtime-core/src/directives.ts @@ -17,7 +17,7 @@ import { warn } from './warning' import { ComponentInternalInstance } from './component' import { currentRenderingInstance } from './componentRenderUtils' import { callWithAsyncErrorHandling, ErrorCodes } from './errorHandling' -import { ComponentPublicInstance } from './componentPublicInstanceProxy' +import { ComponentPublicInstance } from './componentProxy' export interface DirectiveBinding { instance: ComponentPublicInstance | null diff --git a/packages/runtime-core/src/h.ts b/packages/runtime-core/src/h.ts index fbb43c13..6c9c8c9b 100644 --- a/packages/runtime-core/src/h.ts +++ b/packages/runtime-core/src/h.ts @@ -15,7 +15,7 @@ import { ComponentOptionsWithArrayProps, ComponentOptionsWithProps, ComponentOptions -} from './componentOptions' +} from './apiOptions' import { ExtractPropTypes } from './componentProps' // `h` is a more user-friendly version of `createVNode` that allows omitting the diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts index 9a7198d2..d3a8374a 100644 --- a/packages/runtime-core/src/index.ts +++ b/packages/runtime-core/src/index.ts @@ -64,9 +64,9 @@ export { ComponentOptionsWithoutProps, ComponentOptionsWithProps, ComponentOptionsWithArrayProps -} from './componentOptions' +} from './apiOptions' -export { ComponentPublicInstance } from './componentPublicInstanceProxy' +export { ComponentPublicInstance } from './componentProxy' export { RendererOptions } from './createRenderer' export { Slot, Slots } from './componentSlots' export { Prop, PropType, ComponentPropsOptions } from './componentProps'