目录

1  什么是虚拟dom

2  为什么要引入虚拟dom

3  vue中的虚拟dom

4  总结


1  什么是虚拟dom

通过描述状态和dom之间的映射关系是怎样的,就可以将状态渲染成视图。

状态可以是js中的任意类型。Object、Array、String、Number、Boolean等都可以作为状态,这些状态最终会以段落、表单、按钮等元素呈现在用户界面上。

将状态作为输入,并生成dom输出到页面上显示出来,这个过程叫做渲染。

当某个状态发生变化时,只更新与这个状态相关联的dom节点。

虚拟dom的解决办法是:通过状态生成一个虚拟节点树,然后使用虚拟节点树进行渲染。在渲染之前,会使用新生成的虚拟节点树和上一次生成的虚拟节点树进行对比,只渲染不同的部分。

虚拟节点树其实是由组件树建立起来的整个虚拟节点树(vnode)。

2  为什么要引入虚拟dom

vue2.0开始选择用中等粒度的解决办法,那就是虚拟dom。组件级别是一个Watcher实例,就是说即使一个组件内有10个节点使用了某个状态,但其实也只有一个watcher在观察这个状态的变化。所以当这个状态发生变化时,只能通知到组件,然后组件内部通过虚拟dom去进行对比渲染

3  vue中的虚拟dom

vue通过编译将模板转换成渲染函数(render),执行渲染函数就可以得到一个虚拟节点树,使用这个虚拟节点树就可以渲染页面,如下图所示。

为了避免不必要的dom操作,虚拟dom在虚拟节点映射到视图的过程中,将虚拟节点与上一次渲染视图所使用的旧虚拟节点做对比,找到真正需要更新的节点来进行dom操作,从而避免操作其它无任何改动的dom。

虚拟dom在vue中主要做了两件事:

1.提供与真实dom节点所对应的虚拟节点vnode;

2.将虚拟节点vnode和旧虚拟节点oldVnode进行对比,然后更新视图。

虚拟dom最核心的算法是patch

4  总结

先建立虚拟节点再渲染视图,就可以将虚拟节点缓存,然后使用新创建的虚拟节点和上次渲染时缓存的虚拟节点进行对比,然后根据对比结果只更新需要更新的真实dom节点,从而避免不必要的do操作。

vue2采用中等粒度解决方案,状态更新只侦测组件,组件内部通过虚拟dom来渲染视图,这可以大大缩减依赖数量和watcher数量。

vue中通过模板来描述状态与视图之间的映射管旭,所以它会先模板编译成渲染函数,然后执行渲染函数生成虚拟节点,最后使用虚拟节点更新视图。

注:本文章来自于《深入浅出vue.js》(人民邮电出版社)阅读后的笔记整理

Vue2源码解析 虚拟dom简介相关推荐

  1. Vue2源码解析 虚拟节点VNode

    目录 1  什么是VNode 2  VNode的作用 3  VNode的类型 3.1  注释节点 3.2  文本节点 3.3  克隆节点 3.4  元素节点 3.5  组件节点 3.6  函数式组件 ...

  2. Vue2源码解析 解析器

    目录 1  解析器的作用 2  解析器内部运行原理 3  html解析器 3.1  运行原理 3.2  截取开始标签 3.3  截取结束标签 3.4  截取注释 3.5  截取条件注释 3.6  截取 ...

  3. Vue2源码解析 Object变化监听

    目录 1 什么是变化监听 2 如何跟踪变化 3  何如收集依赖 4  依赖收集在哪 5  依赖是谁 6  什么是Watcher 7  递归侦测所有key 8  关于Object的问题 9  总结 1 ...

  4. h2o.ai源码解析(1)—项目简介

    h2o.ai项目简介 参考h2o.ai官网中给出的项目定位是"open source platform for AI".相较于当前市面上的机器学习平台,h2o.ai的优势在于: - ...

  5. 【Vue3】源码解析

    [Vue3]源码解析 首先得知道 Proxy Reflect Symbol Map和Set diff算法 patchChildren diff算法具体做了什么(重点)? patchKeyedChild ...

  6. Vue源码解析之Template转化为AST的实现方法

    什么是AST 在Vue的mount过程中,template会被编译成AST语法树,AST是指抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree) ...

  7. 全网最全Skywalking8.9.1源码解析系列文章

    1.本系列文档简介 本系列文章为研究Skywalking-OAP8.9.1版本, 探针Skywalking-java8.9.0时所著,文章内容来源有博客.官网.自己的体会.源代码剖析.测试所得.专业性 ...

  8. Vue源码解析:虚拟dom比较原理

    通过对 Vue2.0 源码阅读,想写一写自己的理解,能力有限故从尤大佬2016.4.11第一次提交开始读,准备陆续写: 模版字符串转AST语法树 AST语法树转render函数 Vue双向绑定原理 V ...

  9. Vue2.0源码解析——编译原理

    Vue2.0源码解析--编译原理 前言:本篇文章主要对Vue2.0源码的编译原理进行一个粗浅的分析,其中涉及到正则.高阶函数等知识点,对js的考察是非常的深的,因此我们来好好啃一下这个编译原理的部分. ...

最新文章

  1. 剑指offer_第7题_斐波那契数列
  2. Solution 1: BST转双向链表
  3. 神经网络结构与输出值之间的关系
  4. 百度视频携手神策数据 为用户精准推送短视频内容
  5. Javascript Patterns--读书笔记8 (Factory)
  6. Spring mvc HTTP协议之缓存机制
  7. Bootstrap组件1_字体图标
  8. 'unsigned char'-C编程中的声明,赋值和用法
  9. Vue中import引入模块路径时的@符号
  10. Java-标识符和关键字
  11. BZOJ 4518: [Sdoi2016]征途 [斜率优化DP]
  12. python用于数据处理真的那么强大嘛_为什么有那么多人选择Python,真的有那么好吗?...
  13. java配置环境变量为8后仍然显示为7_jdk7与jdk8环境共存与切换
  14. 【Python】@ 操作符
  15. spring-第十篇之XML Schema的简化配置,p、c、util命名空间
  16. 教妹学Java:数组打印最优雅的方式deepToString
  17. 如何拯救k8s镜像分发的阿喀琉斯之踵
  18. 丧尸的世界·《丧尸西游》
  19. 插画素材哪里找?5个超级实用的插画素材库推荐
  20. java eclipse sbt_SBT 构建scala eclipse开发

热门文章

  1. 3D模型制作的流程的步骤
  2. 吴恩达机器学习入门笔记12/13-聚类与降维
  3. 电脑不兼容linux,解决方法:Linux存在图形卡不兼容问题
  4. linux下openvpn服务搭建
  5. 魅族16spro锁回BL(Bootloader) 恢复微信指纹
  6. CTF比赛工具自收集
  7. 持续集成之企业微信通知:1:群机器人使用方法介绍
  8. Mac小教程:Mac电脑怎么安装新字体
  9. 算法练习-Apples Prologue
  10. Linux下CAN总线通信调试记录