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'
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'
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'
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,
// 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) {
import {
PublicInstanceProxyHandlers,
ComponentPublicInstance
-} from './componentPublicInstanceProxy'
+} from './componentProxy'
import { ComponentPropsOptions } from './componentProps'
import { Slots } from './componentSlots'
import { warn } from './warning'
} 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,
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
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,
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
ComponentOptionsWithArrayProps,
ComponentOptionsWithProps,
ComponentOptions
-} from './componentOptions'
+} from './apiOptions'
import { ExtractPropTypes } from './componentProps'
// `h` is a more user-friendly version of `createVNode` that allows omitting the
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'