import { VNodeFlags } from './flags'
import { EMPTY_OBJ } from './utils'
+import { h } from './h'
import { VNode, createFragment } from './vdom'
import { Component, MountedComponent, ComponentClass } from './component'
import { createTextVNode, cloneVNode } from './vdom'
return shouldUpdate
}
+// compat only
export function createComponentClassFromOptions(
options: ComponentOptions
): ComponentClass {
for (const key in options) {
const value = options[key]
if (typeof value === 'function') {
- ;(ObjectComponent.prototype as any)[key] = value
+ ;(ObjectComponent.prototype as any)[key] =
+ key === 'render'
+ ? // normalize render for legacy signature
+ function render() {
+ return value.call(this, h)
+ }
+ : value
}
if (key === 'computed') {
const isGet = typeof value === 'function'
isSVG: boolean,
endNode: RenderNode | RenderFragment | null
): RenderNode {
- const instance = createComponentInstance(
- parentVNode,
- Component,
- parentComponent
- )
+ // a vnode may already have an instance if this is a compat call
+ // with new Vue()
+ const instance =
+ (__COMPAT__ && (parentVNode.children as MountedComponent)) ||
+ createComponentInstance(parentVNode, Component, parentComponent)
const queueUpdate = (instance.$forceUpdate = () => {
queueJob(instance._updateHandle, flushHooks)
// observer api
export * from '@vue/observer'
+// internal api
+export { createComponentInstance } from './componentUtils'
+
// flags & types
-export { FunctionalComponent } from './component'
+export { ComponentClass, FunctionalComponent } from './component'
export { ComponentOptions, PropType } from './componentOptions'
export { VNodeFlags, ChildrenFlags } from './flags'
export { VNode, VNodeData, VNodeChildren, Key, Ref, Slots, Slot } from './vdom'
-import { h, render, ComponentOptions } from '@vue/renderer-dom'
+import {
+ h,
+ render,
+ Component,
+ ComponentOptions,
+ createComponentInstance
+} from '@vue/renderer-dom'
-function Vue(options: ComponentOptions & { el: any }) {
- const { el, render: r } = options
+class Vue extends Component {
+ static h = h
+ static render = render
- if (r) {
- options.render = function(props, slots) {
- return r.call(this, h, props, slots)
+ constructor(options: ComponentOptions & { el: any }) {
+ super()
+ if (!options) {
+ return
}
- }
- function mount(el: any) {
- const dom = document.querySelector(el)
- render(h(options), dom)
- return (dom as any).vnode.children.$proxy
- }
+ const vnode = h(options)
+ const instance = createComponentInstance(vnode, options._normalized, null)
+ vnode.children = instance
+
+ function mount(el: any) {
+ const dom = document.querySelector(el)
+ render(vnode, dom)
+ return instance.$proxy
+ }
- if (el) {
- return mount(el)
- } else {
- return {
- $mount: mount
+ if (options.el) {
+ return mount(options.el)
+ } else {
+ ;(instance as any).$mount = mount
+ return instance.$proxy
}
}
}