虚拟DOM的作用和定义

什么是虚拟DOM

虚拟DOM就是普通的js对象。是一个用来描述真实dom结构的js对象,因为它不是真实的dom,所以才叫做虚拟dom。

虚拟dom的作用

  • 我们都知道传统的dom数据发生变化的时候,我们都需要不断的去操作dom,才能更新dom数据,虽然后面出现了模板引擎,可以让我们一次性更新多个dom。但模板引擎依旧没有一种可以追踪状态的机制,当引擎内某个数据发生变化时,它依然操作dom去重新渲染整个引擎。
  • 而虚拟dom可以很好地跟踪当前dom状态,因为它会根据当前数据生成一个描述当前dom结构的虚拟dom,然后数据发生变化时,有生成一个新的虚拟dom,而两个虚拟dom恰好保存了变化前后的状态。然后通过diff算法,计算出当前两个虚拟dom之间的差异,得出一个更好的替换方案。

vue中的虚拟dom

目前虚拟dom的库很多,常见的有snabbdom 和 virtual-dom,vue以前用的是virtual-dom,自从2.x以后用的都是snabbdom。下面解释的就是snabbdom

snabbdom有四个核心方法

  • h函数
  • patch函数
  • patchVnode函数
  • updateChildren函数

h函数

new Vue({render: h => h(App),
}).$mount('#app')

大家肯定看到过这个函数。没错h函数就是在render函数内运行的。我们了解vue生命周期,知道在created ----- beforeMount之间的时候会将模板编译成render函数,其实就是将模板编译成某种格式放在render函数内,然后当render函数运行的时候,就会生成虚拟dom。编译成什么格式那?让我们来看看源码的参数吧!

export function h(sel: string): VNode;
export function h(sel: string, data: VNodeData | null): VNode;
export function h(sel: string, children: VNodeChildren): VNode;
export function h(sel: string,data: VNodeData | null,children: VNodeChildren
): VNode;
export function h(sel: any, b?: any, c?: any): VNode {let data: VNodeData = {};let children: any;let text: any;let i: number;

定义了很多h函数,这就不得不说说函数的重载了!

函数重载:
函数重载就是定义多个重名函数,利用函数参数个数以及参数的类型来区分。当函数个数不同,参数类型不同时,函数内执行的代码也就不会相同。

当我们以第四种的参数进行传参时:

  • 第一个参数的sel表示dom选择器,如:div#app <div id=“app”></div>
  • 第二个参数表示dom属性,是个对象如:{class:“xiaokang” , value:“今天上海是阴天呀!!”}
  • 第三个参数表示子节点,子节点也可以是一个虚拟的子节点,也可以是文本节点。
const vdom = h('div',{class:'vdom'},[h('p',{class:"text"},['hello word']),h('input',{calss="quxiaokang" ,value:'今天上海是阴天呀!!'})
])

而h函数内最主要的就是执行了 vnode 函数,vnode函数的主要作用就是将h函数传过来的参数转化为了js对象(即虚拟dom)

上面都是一些判断语句,就不多解释了,最后就是执行了生成js对象的代码。

export function vnode(sel: string | undefined,data: any | undefined,children: Array<VNode | string> | undefined,text: string | undefined,elm: Element | Text | undefined
): VNode {const key = data === undefined ? undefined : data.key;return { sel, data, children, text, elm, key };
}

总结:

  • 首先代码初次运行,当走到create 到 beforeMount之间的时候,会编译template模板生成render函数。然后render函数运行时,h函数被调用,而h函数内调用vnode函数生成虚拟dom,并返回生成结果,故虚拟dom第一次生成。
  • 之后当数据发生变化会重新编译生成一个新的vnode,再后就是对比新旧,然后就是diff算了!

什么是虚拟DOM?虚拟DOM的定义和作用?相关推荐

  1. 虚拟dom_虚拟DOM发展的前世与今身

    web这几年蓬勃发展.经历了几个比较大的转变.我们先来大概回顾一下. Jquery 在虚拟Dom被提出来之前,我们前端框架Jquery凭借着良好的兼容性和简单易用的特性征服了大量的前端开发者,从而统治 ...

  2. Vue进阶之Virtual DOM(虚拟DOM) 实现原理

    Vue进阶之Virtual DOM(虚拟DOM) 实现原理 Virtual DOM(虚拟 DOM),是由普通的 JS 对象来描述 DOM 对象,因为不是真实的 DOM 对象,所以叫 Virtual D ...

  3. Vue 源码学习—Virtual DOM(虚拟 DOM)

    Virtual DOM Virtual DOM是什么 真实DOM成员 引入原因 作用 Virtual DOM是什么 定义: 普通的js对象来描述DOM对象,不是真实的DOM,顾名思义,称为虚拟DOM ...

  4. vue之购物车案例升级版、v-model之lazy、number、trim的使用、fetch和axios、计算属性、Mixins、虚拟dom与diff算法 key的作用及组件化开发

    文章目录 1.购物车案例升级版(含价格统计.全选/反选.商品增加减少) 2.v-model之lazy.number.trim的使用 3.fetch和axios 3.1.通过jquery+ajax实现v ...

  5. 虚拟dom_虚拟DOM与dom diff

    什么是虚拟DOM 虚拟DOM是一颗以JavaScript对象(node节点)作为基础的树,用对象属性来描述节点,他是对真实DOM的抽象,通过一些列操作使这棵树映射到真实环境上 虚拟dom就是能代表DO ...

  6. ihtml2document能不能根据id获取dom_回到基础:什么是DOM及DOM操作?

    译者:前端小智 来源:valentinog 为了保证的可读性,本文采用意译而非直译. 文本主要介绍文档对象模型(DOM),了解什么是DOM操作,以及如何使用砶 DOM API 与 JS 中的 Web ...

  7. 什么是DOM及DOM操作?

    什么是 DOM ? DOM(文档对象模型)是针对于xml但是扩展用于HTML的应用程序编程接口,定义了访问和操作HTML的文档的标准. W3C文档对象模型是中立于平台和语言之间的接口,它允许程序和脚本 ...

  8. 什么是DOM,DOM的作用,以及DOM与JavaScript的关系

    一个想学web前端的初学者,如果在知乎中搜索推荐书目的话,得到的答案多数都是:首先,学习htlm+css:第二点就是阅读<JavaScript DOM 编程艺术>这本书. 作为一个初学的小 ...

  9. 前端学习之JavaScript DOM以及DOM操作的基础知识

    在了解了javascript的语言基础和特性后 javascript真正大放光彩的地方来了--这就是javascript DOM Javascript DOM DOM(Document Object ...

最新文章

  1. bash变量和逻辑运算
  2. when ajax,jQuery.when()
  3. [转载]js节流与防抖,防止重复提交、防止频繁重复点击
  4. cocos2d-x 关于tilemap滚动时黑线闪动的问题
  5. 排序算法的时间复杂度_算法的时间复杂度
  6. java主程序怎样调用子程序_存过和函数以及在Java程序中的调用
  7. Sentinel介绍与使用
  8. 数据挖掘:数据仓库相关知识笔记
  9. 学习阮一峰Javascript模块化编程,requireJS使用
  10. Linux vi 行尾 ctrl,linux中vi使用技巧常用技巧和高级替换
  11. mysql 200列_Mysql数据表基本
  12. java图片色差_java – JPEG图像的颜色错误
  13. Zuul使用Ribbon配置自动重试
  14. JAVA练习173-幂集
  15. Vue学习一:Windows下搭建Vue项目(安装nodejs环境)
  16. 看完知乎轮子哥的编程之路,我只想说,收下我的膝盖。。。
  17. 30天自制操作系统-2
  18. STM32自学笔记-7-CAN总线通信
  19. IDEA远程提交hadoop任务时出现的错误
  20. 前端-table表格隔行变色

热门文章

  1. 阿里云服务器部署环境搭建
  2. 配置dm-mpp集群
  3. 悄悄告诉你如何获取别人小程序的源代码(包含wxml,wxss) 绝对有效
  4. QT 关于QProcess的一些总结
  5. 四元数转旋转矩阵公式推导
  6. 校招java实习生面试试题
  7. Unity GUID
  8. RealAudio1
  9. GPT-4发布!迄今为止功能最强大AI模型!
  10. 无Python环境变量python正常使用