vue—render 函数
虚拟 DOM
React 和 Vue2 都使用了虚拟 DOM 技术更新 DOM 节点,提升渲染性能,虚拟 DOM 并不是真正意义上的 DOM,而是一个轻量级的 JavaScript 对象,在状态发生变化时,虚拟 DOM 会进行 diff 运算,来更新只需要被替换的 DOM,而不是全部重绘
与 DOM 操作相比,虚拟 DOM 是基于 JavaScript 计算的,所以开销会小很多
在 Vue2 中,虚拟 DOM 就是通过一种 VNode 类表达,每个 DOM 元素或组件对对应一个 VNode 对象
VNodeData
节点解析:
children
子节点,数组,也是 VNode 类型text
当前节点的文本,一般文本节点或注释节点会有该属性elm
当前虚拟节点对应的真实的 DOM 节点ns
节点的namespace
content
编译作用域functionalContext
函数化组件的作用域key
节点的key
属性,用于作为节点的标识,有利于patch
的优化componentOptions
创建组件实例时会用到的选项信息child
当前节点对应的组件实例parent
组件的占位节点raw
原始html
isStatic
静态节点的标识isRootInset
是否作为根节点插入,被<transition>
包裹的节点,该属性的值为false
isConment
当前节点是否是注释节点isCloned
当前节点是否为克隆节点isOnce
当前节点是否有v-once
指令
VNode 主要可以分为以下几类:
TextVNode
文本节点ElementVNode
普通元素节点ComponentVNode
组件节点EmptyVNode
没有内容的注释节点CloneVNode
克隆节点,可以是以上任意类型的节点,唯一的区别在于isCloned
属性为true
Render 函数通过createElement
参数来创建虚拟 DOM,结构精简。其中,访问slot
的用法,使用场景集中在 Render 函数
CreateElement 用法
createElement
构成了 Vue 虚拟 DOM 的模板,它有 3 个参数:
第一个参数必选,可以是一个 HTML 标签,也可以是一个组件或函数;第二个是可选参数,数据对象,在template
中使用。第三个是子节点,也是可选参数
之前在template
中都是在组件的标签上使用v-bind:class
、v-bind:style
、v-on:click
这样的指令,在 Render 函数都将其写在了数据对象中
约束
所有的组件树中,如果 VNode 是组件或含有组件的slot
,nameVNode 必须唯一
在 Render 函数里创建了一个cloneVNode
的工厂函数,通过递归将slot
所有子节点都克隆了一份,并对 VNode 的关键属性也进行复制
在 Render 函数中,不再需要 Vue 内置的指令,比如v-if
、v-for
。无论要实现什么功能,都可以使用原生 JavaScript
版权声明: 本文为 InfoQ 作者【格斗家不爱在外太空沉思】的原创文章。
原文链接:【http://xie.infoq.cn/article/5a606c26182d483db23a7b793】。文章转载请联系作者。
评论