15-什么是Virtual Dom

Virtual Dom并不是真正意义上的Dom,而是一个轻量级的JavaScript对象,在状态发生变化的时候,Virtual Dom会进行Diff运算,来更新只需要被替换的DOM,而不是全部重绘。

与DOM操作相比,Virtual Dom是基于JavaScript计算的,所以开销会小很多。

用Virtual Dom创建的JavaScript对象一般会是这样:

var vNode= {

tag:"div",

attributes:{

id:"main"

},

children:[

//节点

]

}

vNode对象通过一些特定的选项描述了真实的DOM结构。

在Vue.js2中,Virtual Dom就是通过一种VNode类表达的,每个DOM元素或者组件都对应一个VNode对象,在Vue.js源码中是这样定义的:

export interface VNode{

tag?:string;

data?:VNodeData;

children?:VNode[];

text?:string;

elm?:Node;

ns?:string;

context?:Vue;

key?:string | number;

componentOptions?:VNodeComponentOptions;

componentInstance?:Vue;

parent?:VNode;

raw?:boolean;

isStatic?:boolean;

isRootInsert:boolean;

isComponent:boolean;

}

具体含义如下:

tag:当前节点的标签名

data:当前节点的数据对象

children:子节点,数组,也是VNode类型

text:当前节点的文本,一般文本节点或注释节点会有该属性

elm:当前虚拟节点对应的真实的DOM节点

ns:节点的namespace

context:编译作用域

functionalContext:函数化组件的作用域

key:节点的key属性,用于作为节点的标识,有利于patch的优化

componentOptions:创建组件实例时会用到的选项信息

child:当前节点对应的组件实例

parent:组建的占位节点

raw:原始html

isStatic:静态节点的标识

isRootInsert:是否作为根节点插入,被<transition>包裹的节点,该属性的值为false

isComment:当前节点是都是注释节点

isCloned:当前节点是否为克隆节点

isOnce:当前节点是否有v-once指令

VNode主要分为以下几类:

TextVNode 文本节点

ElementVNode 普通元素节点

ComponentVNode 组件节点

EmptyVNode 没有内容的注释节点

CloneVNode 克隆节点,可以是以上任意类型的节点,唯一的区别在于isCloned属性为true

使用Virtual Dom就可以完全发挥JavaScript的编程能力。在多数场合,我们使用template就足够了,但在一些特定的场景下,使用Virtual Dom会更简单。

原文地址:https://www.cnblogs.com/Romantic-Blood/p/11108160.html

时间: 2024-10-31 03:54:39

15-什么是Virtual Dom的相关文章

如何实现一个 Virtual DOM 及源码分析

Virtual DOM算法 web页面有一个对应的DOM树,在传统开发页面时,每次页面需要被更新时,都需要手动操作DOM来进行更新,但是我们知道DOM操作对性能来说是非常不友好的,会影响页面的重排,从而影响页面的性能.因此在React和VUE2.0+引入了虚拟DOM的概念,他们的原理是:把真实的DOM树转换成javascript对象树,也就是虚拟DOM,每次数据需要被更新的时候,它会生成一个新的虚拟DOM,并且和上次生成的虚拟DOM进行对比,对发生变化的数据做批量更新.---(因为操作JS对象会

Virtual DOM 虚拟DOM的理解(转)

作者:戴嘉华 转载请注明出处并保留原文链接( #13 )和作者信息. 目录: 1 前言 2 对前端应用状态管理思考 3 Virtual DOM 算法 4 算法实现 4.1 步骤一:用JS对象模拟DOM树 4.2 步骤二:比较两棵虚拟DOM树的差异 4.3 步骤三:把差异应用到真正的DOM树上 5 结语 6 References 1 前言 本文会在教你怎么用 300~400 行代码实现一个基本的 Virtual DOM 算法,并且尝试尽量把 Virtual DOM 的算法思路阐述清楚.希望在阅读本

Virtual DOM 算法

前端 virtual-dom react.js javascript 目录: 1 前言 2 对前端应用状态管理思考 3 Virtual DOM 算法 4 算法实现 4.1 步骤一:用JS对象模拟DOM树 4.2 步骤二:比较两棵虚拟DOM树的差异 4.3 步骤三:把差异应用到真正的DOM树上 5 结语 6 References 1 前言 本文会在教你怎么用 300~400 行代码实现一个基本的 Virtual DOM 算法,并且尝试尽量把 Virtual DOM 的算法思路阐述清楚.希望在阅读本

深度理解 Virtual DOM

目录: 1 前言 2 技术发展史 3 Virtual DOM 算法 4 Virtual DOM 实现 5 Virtual DOM 树的差异(Diff算法) 6 结语 7 参考链接 1 前言 我会尽量把 Virtual DOM 应用场景.实现思路.算法讲述清楚,希望大家阅读后,能让你 深入理解 Virtual DOM. 2 技术发展史 写一个像下面的应用程序,这个表格可以根据不同的字段进行升序或者降序. 最容易的方案是在你的 JavaScript 代码里面存储这样的数据: var sortKey

Virtual DOM

Virtual DOM是React的核心技术之一. virtual   英 [?v?:t?u?l]    美 [?v?:rt?u?l] adj.    实质上的,事实上的; (计算机) 虚拟的; <物>有效的,虚像的; (粒子) 实际存在的; 实际上,Virtual DOM包含: Javascript DOM模型树(VTree),类似文档节点树(DOM) DOM模型树转节点树方法(VTree -> DOM) 两个DOM模型树的差异算法(diff(VTree, VTree) -> P

Vue.js 2.0更新之增加Virtual DOM讲解

Virtual DOM是什么?在之前,React和Ember早就开始用虚拟DOM技术来提高页面更新的速度了. 若想了解它是如何工作的,就要先认清这几个概念:1.更新DOM是非常昂贵的操作当我们使用Javascript来修改我们的页面,浏览器已经做了一些工作,以找到DOM节点进行更改,例如: document.getElementById('myId').appendChild(myNewNode); 在现代的应用中,会有成千上万数量个DOM节点.所以因更新的时候产生的计算非常昂贵.琐碎且频繁的更

实现一个 Virtual DOM 算法

1 前言 本文会在教你怎么用 300~400 行代码实现一个基本的 Virtual DOM 算法,并且尝试尽量把 Virtual DOM 的算法思路阐述清楚.希望在阅读本文后,能让你深入理解 Virtual DOM 算法,给你现有前端的编程提供一些新的思考. 本文所实现的完整代码存放在 Github. 2 对前端应用状态管理的思考 假如现在你需要写一个像下面一样的表格的应用程序,这个表格可以根据不同的字段进行升序或者降序的展示. 这个应用程序看起来很简单,你可以想出好几种不同的方式来写.最容易想

Virtual DOM的简单实现

了解React的同学都知道,React提供了一个高效的视图更新机制:Virtual DOM,因为DOM天生就慢,所以操作DOM的时候要小心翼翼,稍微改动就会触发重绘重排,大量消耗性能. 1.Virtual DOM Virtual DOM是利用JS的原生对象来模拟DOM,既然DOM是对象,我们也可以用原生的对象来表示DOM. var element = { tagName: 'ul', // 节点标签名 props: { class: 'list' // 节点的属性,ID,class... },

如何理解vue,virtual DOM

Vue.js 2.0窥探之Virtual DOM到底是什么? Vue.js 2.0已经发布,并且在其中新添加如了一些新功能.其中一个功能就是"Virtual DOM". Virtual DOM是什么? 在之前,React和Ember早就开始用虚拟DOM技术来提高页面更新的速度了. 若想了解它是如何工作的,就要先认清这几个概念: 1.更新DOM是非常昂贵的操作 当我们使用Javascript来修改我们的页面,浏览器已经做了一些工作,以找到DOM节点进行更改,例如:document.get

浅谈 Virtual Dom 的那些事

背景 我们都知道频繁的dom给我们带来的代价是昂贵的,例如我们有时候需要去更新Table 的部分数据,必须去重新重绘表格,这代价实在是太大了,相比于频繁的手动去操作dom而带来性能问题,vdom很好的将dom做了一层映射关系,进而将在我们本需要直接进行dom的一系列操作,映射到了操作vdom. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">