Virtual DOM 是JavaScript按照DOM的结构来创建的虚拟树型结构对象,是对DOM的抽象,比DOM更加轻量型

为啥要使用Virtual DOM

当然是前端优化方面,避免频繁操作DOM,频繁操作DOM会可能让浏览器回流和重绘,性能也会非常低,还有就是手动操作 DOM 还是比较麻烦的,要考虑浏览器兼容性问题,当前jQuery等库简化了 DOM操作,但是项目复杂了,DOM操作还是会变得复杂,数据操作也变得复杂

并不是所有情况使用虚拟DOM 都提高性能,是针对在复杂的的项目使用。如果简单的操作,使用虚拟DOM,要创建虚拟DOM对象等等一系列操作,还不如普通的DOM 操作

虚拟DOM 可以实现跨平台渲染,服务器渲染 、小程序、原生应用都使用了虚拟DOM

使用虚拟DOM改变了当前的状态不需要立即的去更新DOM 而且更新的内容进行更新,对于没有改变的内容不做任何操作,通过前后两次差异进行比较

虚拟 DOM 可以维护程序的状态,跟踪上一次的状态

在Web早期,页面的交互比较简单,没有复杂的状态需要管理,也不太需要频繁的操作DOM,随着时代的发展,页面上的功能越来越多,我们需要实现的需求也越来越复杂,DOM的操作也越来越频繁。通过js操作DOM的代价很高,因为会引起页面的重排重绘,增加浏览器的性能开销,降低页面渲染速度,既然操作dom的代价很高那么有没有那种方式可以减少对dom的操作?这就是为什么提出虚拟dom一个很重要的原因。

浅谈Vue中的虚拟DOM

在正式介绍Virtual DOM之前,我们有必要先了解下模版转换成视图的整个过程(如下图):

Vue.js通过编译将模版转换成渲染函数(render),执行渲染函数就可以得到一个虚拟DOM 在对模型进行操作的时候,会触发对应的Dep中的Watcher对象。Watcher对象会调用对应的update来修改视图。这个过程主要是将新旧虚拟DOM进行差异对比,然后根据结果进行对比。

简单点讲,在Vue的实现上,Vue讲模版编译成虚拟DOM渲染函数。结合Vue自带的响应系统,在状态改变时,Vue能够智能地计算出重新渲染组件的最小代价并应用到DOM操作上。

我们先对上图几个概念嵌入解释:

渲染函数:渲染函数是用来生成虚拟DOM的。Vue推荐使用模版来构建我们的应用界面,在实现中Vue布局模版编译成渲染函数,当然我们也可以不写模版,直接写渲染函数,这样子更接近编译后的模版。

vnode虚拟节点:它可以代表一个真实的DOM节点通过createElement方法能将vnode渲染成DOM节点,简单地说,虚拟节点可以理解成节点描述对象,它描述了应该怎样去创建真实的DOM节点。

patch(也称为patching算法):虚拟DOM最核心的部分,它可以将vnode渲染成真实的DOM,这个过程是对比新旧虚拟节点之间有哪些不同,然后根据对比结果找出需要更新的的节点进行更新。这点我们从单词含义就可以看出, patch本身就有补丁、修补的意思,其实际作用是在现有DOM上进行修改来实现更新视图的目的。Vue的Virtual DOM Patching算法是基于Snabbdom的实现,并在些基础上作了很多的调整和改进。

浅谈Vue中的虚拟DOM相关推荐

  1. vue 给checkbox 赋值_浅谈vue中关于checkbox数据绑定v-model指令的个人理解

    vue.js为开发者提供了很多便利的指令,其中v-model用于表单的数据绑定很常见, 下面是最常见的例子: {{msg}} js里data初始化数据 new Vue({ el: "#myA ...

  2. java get请求 数组,浅谈vue中get请求解决传输数据是数组格式的问题

    qs的stringify接收2个参数,第一个参数是需要序列化的对象,第二个参数是转化格式,一般默认格式是给出明确的索引,如:arr[0]=1&arr[1]=2 //indices是index的 ...

  3. 简单实现Vue中的虚拟dom

    简单实现Vue中的虚拟dom 传送门:简单实现Vue中的插值替换(三) 前言: 要想简单实现虚拟dom,首先我们要了解虚拟dom,知道自己要实现的是个什么东西. 说起来,我刚开始学习Vue的时候对虚拟 ...

  4. vue 中的虚拟dom树

    虚拟DOM树其实就是一个普通的js对象,它是用来描述一段HTML片段的 当页面渲染的时候Vue会创建一颗虚拟DOM树 当页面发生改变Vue会再创建一颗新的虚拟DOM树 前后两颗新旧虚拟DOM树进行对比 ...

  5. Vue中的虚拟DOM

    文章目录 一.什么是虚拟DOM 二.虚拟DOM的作用 提高性能 三.通过模板转换成视图来理解 一.什么是虚拟DOM 我们都知道DOM是什么,它是实实在在的被渲染在页面上的,我们平时的操作都和DOM息息 ...

  6. vue中的虚拟DOM原理

    1.定义: 虚拟DOM其实就是用一个原生的JS对象去描述一个DOM节点,实际上它只是对真实 DOM 的一层抽象.最终可以通过一系列操作使这棵树映射到真实环境上. 相当于在js与DOM之间做了一个缓存, ...

  7. 浅谈Vue中的Prop

    Prop 基本用法 Prop的基本用法很简单,只需要在子组件的Vue实例中定义该属性并把值设为目标属性的数组即可 Vue.component('child', {...// 接收messageprop ...

  8. vue 中provide的用法_浅谈vue中provide和inject 用法

    一.概念解析 成对出现:provide和inject是成对出现的 作用:用于父组件向子孙组件传递数据 使用方法:provide在父组件中返回要传给下级的数据,inject在需要使用这个数据的子辈组件或 ...

  9. vue 中provide的用法_[转]浅谈vue中provide和inject 用法

    provide:Object | () => Object inject:Array | { [key: string]: string | Symbol | Object } provide ...

最新文章

  1. vc6中进行多行注释和反注释的方法
  2. 刘光毅:频谱统一推进5G尽早商用 4G网络向5G平滑演进
  3. Python开发编码规范(转)
  4. 每张脸值5美元,谷歌花钱买数据强化刷脸,还把隔空操控手机变成现实
  5. 互联网工作原理(17.网络电视是如何工作的)
  6. 解决 APP启动白屏黑屏问题
  7. Python列表,元组,字典的区别
  8. challenging and foundational
  9. equals java的用法_Java ConcurrentLinkedDeque equals()用法及代码示例
  10. Java NIO之Selector
  11. 用户登陆_「python学习笔记」用户登陆需求实现(for/if/str知识点)
  12. 读《我们终将逝去的青春》
  13. git分布式版本管理系统和github平台
  14. 【Regular正则表达式】正则表达式学习
  15. 微信小程序时间轴demo_微信小程序时间轴实现方法示例
  16. AFX_EXT_CLASS的使用
  17. python里写中文出现 “SyntaxError: Non-ASCII character... but no encoding declared”解决方法
  18. 清零术——Stay hungry,Stay foolish
  19. 利用python在网上接单赚钱,兼职也能月入过万,赶紧学起来!
  20. php mysql mvc_PHP MVC框架【Myphp】的编写

热门文章

  1. 米聊关停;抖音支付正式上线;谷歌禁用第三方 Chromium 同步功能 | 极客头条
  2. 解析 PowerJob 的序列化方案
  3. 当芯片教父遇上伊隆马斯克:自动驾驶路在何方
  4. 明晚 8 点,为你揭秘「AI 换脸术」:剧照 or 视频换脸背后的核心技术与应用
  5. 154 万 AI 开发者用数据告诉你,中国 AI 如何才能弯道超车?| 中国 AI 应用开发者报告
  6. Python 数据分析实战:经典的同期群分析
  7. IDEA 社区版不支持 Tomcat?一招完美解决!
  8. 支付宝解释 2019 年账单总额较高;腾讯 QQ 回应新功能可显示对方实时电量;Python 2.7 结束支持 | 极客头条...
  9. 多媒体技术开发迎来新常态
  10. Arm 与中国联通成功部署物联网设备管理平台解决方案