/* @flow */
|
|
export default class VNode {
|
tag: string | void;
|
data: VNodeData | void;
|
children: ?Array<VNode>;
|
text: string | void;
|
elm: Node | void;
|
ns: string | void;
|
context: Component | void; // rendered in this component's scope
|
key: string | number | void;
|
componentOptions: VNodeComponentOptions | void;
|
componentInstance: Component | void; // component instance
|
parent: VNode | void; // component placeholder node
|
|
// strictly internal
|
raw: boolean; // contains raw HTML? (server only)
|
isStatic: boolean; // hoisted static node
|
isRootInsert: boolean; // necessary for enter transition check
|
isComment: boolean; // empty comment placeholder?
|
isCloned: boolean; // is a cloned node?
|
isOnce: boolean; // is a v-once node?
|
asyncFactory: Function | void; // async component factory function
|
asyncMeta: Object | void;
|
isAsyncPlaceholder: boolean;
|
ssrContext: Object | void;
|
fnContext: Component | void; // real context vm for functional nodes
|
fnOptions: ?ComponentOptions; // for SSR caching
|
devtoolsMeta: ?Object; // used to store functional render context for devtools
|
fnScopeId: ?string; // functional scope id support
|
|
constructor (
|
tag?: string,
|
data?: VNodeData,
|
children?: ?Array<VNode>,
|
text?: string,
|
elm?: Node,
|
context?: Component,
|
componentOptions?: VNodeComponentOptions,
|
asyncFactory?: Function
|
) {
|
this.tag = tag
|
this.data = data
|
this.children = children
|
this.text = text
|
this.elm = elm
|
this.ns = undefined
|
this.context = context
|
this.fnContext = undefined
|
this.fnOptions = undefined
|
this.fnScopeId = undefined
|
this.key = data && data.key
|
this.componentOptions = componentOptions
|
this.componentInstance = undefined
|
this.parent = undefined
|
this.raw = false
|
this.isStatic = false
|
this.isRootInsert = true
|
this.isComment = false
|
this.isCloned = false
|
this.isOnce = false
|
this.asyncFactory = asyncFactory
|
this.asyncMeta = undefined
|
this.isAsyncPlaceholder = false
|
}
|
|
// DEPRECATED: alias for componentInstance for backwards compat.
|
/* istanbul ignore next */
|
get child (): Component | void {
|
return this.componentInstance
|
}
|
}
|
|
export const createEmptyVNode = (text: string = '') => {
|
const node = new VNode()
|
node.text = text
|
node.isComment = true
|
return node
|
}
|
|
export function createTextVNode (val: string | number) {
|
return new VNode(undefined, undefined, undefined, String(val))
|
}
|
|
// optimized shallow clone
|
// used for static nodes and slot nodes because they may be reused across
|
// multiple renders, cloning them avoids errors when DOM manipulations rely
|
// on their elm reference.
|
export function cloneVNode (vnode: VNode): VNode {
|
const cloned = new VNode(
|
vnode.tag,
|
vnode.data,
|
// #7975
|
// clone children array to avoid mutating original in case of cloning
|
// a child.
|
vnode.children && vnode.children.slice(),
|
vnode.text,
|
vnode.elm,
|
vnode.context,
|
vnode.componentOptions,
|
vnode.asyncFactory
|
)
|
cloned.ns = vnode.ns
|
cloned.isStatic = vnode.isStatic
|
cloned.key = vnode.key
|
cloned.isComment = vnode.isComment
|
cloned.fnContext = vnode.fnContext
|
cloned.fnOptions = vnode.fnOptions
|
cloned.fnScopeId = vnode.fnScopeId
|
cloned.asyncMeta = vnode.asyncMeta
|
cloned.isCloned = true
|
return cloned
|
}
|