实现 Virtual DOM 下的一个 VNode 节点
什么是VNode
我们知道,render function 会被转化成 VNode 节点。Virtual DOM 其实就是一棵以 JavaScript 对象(VNode 节点)作为基础的树,用对象属性来描述节点,实际上它只是一层对真实 DOM 的抽象。最终可以通过一系列操作使这棵树映射到真实环境上。由于 Virtual DOM 是以 JavaScript 对象为基础而不依赖真实平台环境,所以使它具有了跨平台的能力,比如说浏览器平台、Weex、Node 等。
实现一个VNode
VNode 归根结底就是一个 JavaScript 对象,只要这个类的一些属性可以正确直观地描述清楚当前节点的信息即可。我们来实现一个简单的 VNode
类,加入一些基本属性,为了便于理解,我们先不考虑复杂的情况。
1 | class VNode { |
比如我目前有这么一个 Vue 组件。
1 | <template> |
用 JavaScript 代码形式就是这样的。
1 | function render () { |
看看转换成 VNode 以后的情况。
1 | { |
然后我们可以将 VNode 进一步封装一下,可以实现一些产生常用 VNode 的方法。
- 创建一个空节点
1 | function createEmptyVNode () { |
- 创建一个文本节点
1 | function createTextVNode (val) { |
- 克隆一个 VNode 节点
1 | function cloneVNode (node) { |
总的来说,VNode 就是一个 JavaScript 对象,用 JavaScript 对象的属性来描述当前节点的一些状态,用 VNode 节点的形式来模拟一棵 Virtual DOM 树。
注:本节代码参考[《实现 Virtual DOM 下的一个 VNode 节点》](https://github.com/answershuto/VueDemo/blob/master/《实现 Virtual DOM 下的一个 VNode 节点》.js)。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Jungle!