实现 Virtual DOM 下的一个 VNode 节点

什么是VNode

我们知道,render function 会被转化成 VNode 节点。Virtual DOM 其实就是一棵以 JavaScript 对象(VNode 节点)作为基础的树,用对象属性来描述节点,实际上它只是一层对真实 DOM 的抽象。最终可以通过一系列操作使这棵树映射到真实环境上。由于 Virtual DOM 是以 JavaScript 对象为基础而不依赖真实平台环境,所以使它具有了跨平台的能力,比如说浏览器平台、Weex、Node 等。

实现一个VNode

VNode 归根结底就是一个 JavaScript 对象,只要这个类的一些属性可以正确直观地描述清楚当前节点的信息即可。我们来实现一个简单的 VNode 类,加入一些基本属性,为了便于理解,我们先不考虑复杂的情况。

class VNode {constructor (tag, data, children, text, elm) {/*当前节点的标签名*/this.tag = tag;/*当前节点的一些数据信息,比如props、attrs等数据*/this.data = data;/*当前节点的子节点,是一个数组*/this.children = children;/*当前节点的文本*/this.text = text;/*当前虚拟节点对应的真实dom节点*/this.elm = elm;}
}

比如我目前有这么一个 Vue 组件。

<template><span class="demo" v-show="isShow">This is a span.</span>
</template>

用 JavaScript 代码形式就是这样的。

function render () {return new VNode('span',{/* 指令集合数组 */directives: [{/* v-show指令 */rawName: 'v-show',expression: 'isShow',name: 'show',value: true}],/* 静态class */staticClass: 'demo'},[ new VNode(undefined, undefined, undefined, 'This is a span.') ]);
}

看看转换成 VNode 以后的情况。

{tag: 'span',data: {/* 指令集合数组 */directives: [{/* v-show指令 */rawName: 'v-show',expression: 'isShow',name: 'show',value: true}],/* 静态class */staticClass: 'demo'},text: undefined,children: [/* 子节点是一个文本VNode节点 */{tag: undefined,data: undefined,text: 'This is a span.',children: undefined}]
}

然后我们可以将 VNode 进一步封装一下,可以实现一些产生常用 VNode 的方法。

  • 创建一个空节点
function createEmptyVNode () {const node = new VNode();node.text = '';return node;
}
  • 创建一个文本节点
function createTextVNode (val) {return new VNode(undefined, undefined, undefined, String(val));
}
  • 克隆一个 VNode 节点
function cloneVNode (node) {const cloneVnode = new VNode(node.tag,node.data,node.children,node.text,node.elm);return cloneVnode;
}

总的来说,VNode 就是一个 JavaScript 对象,用 JavaScript 对象的属性来描述当前节点的一些状态,用 VNode 节点的形式来模拟一棵 Virtual DOM 树。

注:本节代码参考《实现 Virtual DOM 下的一个 VNode 节点》。

上一篇:响应式系统的依赖收集追踪原理下一篇:template 模板是怎样通过 Compile 编译的

实现 Virtual DOM 下的一个 VNode 节点相关推荐

  1. IDEA工具-在pannel自己独立下挂一个节点(非标准)

    主体的最开始的下挂节点的部分自己没有研究,自己只是在这个的基础上下挂了一些其他的东西,但是拜读了整个的代码,觉得非常的有意思,写了一个回顾和总结. 自己在已经有的树上下挂一个场景节点,就像在proje ...

  2. [Vue源码分析] Virtual DOM

    最近小组有个关于vue virtual dom的分享会,提前准备一下- 读前须知: 本文章涉及源码版本为Vue 2.5.2,文中涉及到源码部分,解释直接写在源码中(中文部分为本人添加),截图尽量放完整 ...

  3. Vue源码分析系列四:Virtual DOM

    前言 当我们操作Dom其实是一件非常耗性能的事,每个元素都涵盖了许多的属性,因为浏览器的标准就把 DOM 设计的非常复杂.而Virtual Dom就是用一个原生的JS对象去描述一个DOM节点,即VNo ...

  4. vue源码分析系列三:render的执行过程和Virtual DOM的产生

    render 手写 render 函数,仔细观察下面这段代码,试想一下这里的 createElement 参数是什么 . new Vue({el: '#application',render(crea ...

  5. textarea实现datalist效果_手把手撸代码实现Virtual Dom amp;amp; Diff

    前言 文章开篇,我们先思考一个问题,大家都说 virtual dom 这,virtual dom 那的,那么 virtual dom 到底是啥? 首先,我们得明确一点,所谓的 virtual dom, ...

  6. 合格前端系列第五弹- Virtual Dom Diff

    2019独角兽企业重金招聘Python工程师标准>>> 前言 这是一篇很长的文章!!!坚持看到最后有彩蛋哦!!! 文章开篇,我们先思考一个问题,大家都说 virtual dom 这, ...

  7. 说说VNode节点(Vue.js实现)

    写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出. 文章的原地址:https://github.com/a ...

  8. 说说VNode节点(Vue.js实现) 1

    写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出. 文章的原地址:github.com/answershu ...

  9. 什么是Virtual Dom

    什么是Virtual Dom? 所谓的 virtual dom,也就是虚拟节点.它通过 JS 的 Object 对象模拟 DOM 中的节点,然后再通过特定的 render 方法将其渲染成真实的 DOM ...

最新文章

  1. struts2 iterator list中对象的list 双层迭代
  2. 【深度学习入门到精通系列】使用Plotly绘制气泡图(以U-Net等网络性能比较为例)
  3. 分享懒人张RDLC报表(四)
  4. 【STM32】typedef 类型及配合结构体使用
  5. static在类中的定义,和enum的用法
  6. 多线程编程之二——MFC中的多线程开发
  7. boost::uuid::string_generator相关的测试程序
  8. 汇编指令CALL与JMP的区别
  9. 二十四种设计模式:备忘录模式(Memento Pattern)
  10. Quartz 定时器任务调度
  11. [转]kafka介绍
  12. 当导用模块与包的import与from的问题(模块与包的调用)
  13. CH 5102Mobile Service题解
  14. python3 tkinter详解_python tkinter基本属性详解
  15. 用PHP实现多级树型菜单
  16. 航迹推演(Odometry)_由左右轮速度v_l,v_r推导车辆的线速度v,角速度w,运动半径r
  17. 最值得收藏的几种文档对比、文本对比、代码对比、文件对比的工具
  18. STM32程序下载电路分析
  19. C++ 几种智能指针的简单实现
  20. 计算机用固态硬盘无法启动不了,windows10系统安装固态硬盘开启AHCI后开不了机怎么办...

热门文章

  1. 移动开发在路上-- IOS移动开发系列 多线程二
  2. WPF入门教程系列(一) 创建你的第一个WPF项目
  3. 详解CSS的盒模型(box model) 及 CSS3新增盒模型计算方式box-sizing
  4. Bootstrap3 价格滑动块 price range bootstrap-slider
  5. 深入理解JavaScript系列:闭包(Closures)
  6. Linux 系统的运行级别(Run Level)
  7. 在Ubuntu 13.10 下安装支持SSL的Apache
  8. mysql 格式化日期 DATE_FORMAT,FROM_UNIXTIME,UNIX_TIME等
  9. 19.删除链表的倒数第N个节点
  10. LinuxCNC基础知识