vnode
基本属性的定义可以参见源码:src/vdom/vnode.js里面对于vnode
的定义。
constructor (
tag?: string,
data?: VNodeData, // 关于这个节点的data值,包括attrs,style,hook等
children?: ?Array<VNode>, // 子vdom节点
text?: string, // 文本内容
elm?: Node, // 真实的dom节点
context?: Component, // 创建这个vdom的上下文
componentOptions?: VNodeComponentOptions
) {
this.tag = tag
this.data = data
this.children = children
this.text = text
this.elm = elm
this.ns = undefined
this.context = context
this.functionalContext = 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
}
// DEPRECATED: alias for componentInstance for backwards compat.
/* istanbul ignore next */
get child (): Component | void {
return this.componentInstance
}
}
每一个vnode
都映射到一个真实的dom
节点上。其中几个比较重要的属性:
-
tag
属性即这个vnode
的标签属性 -
data
属性包含了最后渲染成真实dom
节点后,节点上的class
,attribute
,style
以及绑定的事件 -
children
属性是vnode
的子节点 -
text
属性是文本属性 -
elm
属性为这个vnode
对应的真实dom
节点 -
key
属性是vnode
的标记,在diff
过程中可以提高diff
的效率,后文有讲解
比如,我定义了一个vnode
,它的数据结构是:
{
tag: 'div'
data: {
id: 'app',
class: 'page-box'
},
children: [
{
tag: 'p',
text: 'this is demo'
}
]
}
最后渲染出的实际的dom
结构就是:
<div id="app" class="page-box">
<p>this is demo</p>
</div>
网友评论