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节点的namespacecontent编译作用域functionalContext函数化组件的作用域key节点的key属性,用于作为节点的标识,有利于patch的优化componentOptions创建组件实例时会用到的选项信息child当前节点对应的组件实例parent组件的占位节点raw原始htmlisStatic静态节点的标识isRootInset是否作为根节点插入,被<transition>包裹的节点,该属性的值为falseisConment当前节点是否是注释节点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】。文章转载请联系作者。









评论