虚拟dome和diff算法

news/2024/7/10 1:57:28 标签: vue

5## 虚拟DOM和Diff算法

虚拟DOM

1.什么是虚拟DOM

  • 用一个简单的对象去代替复杂的DOM对象,存储了对应DOM的一些重 要参数,在改变DOM之前,会先比较相应虚拟DOM的数据,如果需要改变,才 会将改变应用到真实DOM上

2.虚拟DOM的作用是什么

  1. 兼容性好。因为Vnode本质是JS对象,所以不管Node还是浏览器环境,都可以操作;
  2. 减少了对DOM的操作。页面中的数据和状态变化,都通过Vnode对比,只需要在比对完之后更新DOM,不需要频繁操作,提高了页面性能;

3.虚拟DOM和真是DOM的区别

  1. 虚拟DOM不会进行回流和重绘;
  2. 真实DOM在频繁操作时引发的回流重绘导致性能很低;
  3. 虚拟DOM频繁修改,然后一次性对比差异并修改真实DOM,最后进行依次回流重绘,减少了真实DOM中多次回流重绘引起的性能损耗;
  4. 虚拟DOM有效降低大面积的重绘与排版,因为是和真实DOM对比,更新差异部分,所以只渲染局部;

Diff算法

1.什么是Diff算法

  1. diff算法就是进行虚拟节点对比,并返回一个patch对象,用来存储两个节点不同的地方,最后用patch记录的消息去局部更新Dom。简单的说:diff的过程就是调用名为patch的函数,比较新旧节点,一边比较一边给真实的DOM打补丁

2.它的两个特点

  1. 比较只会在同层级进行, 不会跨层级比较
  2. 在diff比较的过程中,循环从两边向中间比较

3.Diff算法的实现

1、 用javascript对象结构表示DOM树到的结构,然后用这个树构建一个真正的DOM树,插到文档当中

2、 当状态变更的时候,重新构造一棵新的树和旧的树进行比较,记录两棵树差异

3、 把第二棵树所记录的差异应用到第一棵树所构建的真正的DOM树上(patch),视图就更新了


http://www.niftyadmin.cn/n/1836149.html

相关文章

Spring JSR-250注解

注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名、类型等信息,如果关系表字段和 PO 属性…

CxImage C++Builder6使用说明

1。下载CxImage CBuilder6源码包,编译生成lib库2。在开发项目添加CxImage库及头文件3。此时编译会出现重复声明错误,选择Project->Options->Directories/Conditional 标签修改conditional defines的值为WIN32。 4。再次编译成功。 转载于:https://…

vue中如何使用keep-alive

vue中如何使用keep-alive 1.keep-alive的概念 1.1: keep-alive 是 Vue 的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 transition 相似,keep-alive 是一个抽象组件:它自身不…

微信小程序封装组件的思路

微信小程序封装组件的思路 1.第一步:我一般在根目录下面创建一个components文件,里面放要要封装的子组件。 2.第二步:在创建的components这个文件夹里面创建我们要封装的子组件。在这个文件的目录下右键选择新建component,它会自…

研发部门压力管理探讨

富士康、华为员工跳楼事件,在媒体与舆论的背后,与死者们处于相似境地的我们,需要更多冷静和专业的思考,以及应对。在这篇文章中,我将目光集中在“压力管理”这个现代企业管理的名词上。认知压力消极怠工、负面评论、伤…

关于MVC权限控制的一点小想法

近来一直在学习MVC。 先检讨一下自己,本来一直在看WPF并向Silverlight靠拢的,可XAML这个东西一时半会领会不了它的真谛,所以暂时先放下了。虽然MVC看的比较系统,但暂时闲置了WPF和Silverlight还是有点沮丧感,觉得自己没…

Win7安装Tomcat

1.解压Tomcat包到D: 2.在Win7高级环境配置中建立变量Tomcat 输入路径值&#xff1a;D:\apache-tomcat-6.0.14 3. 在Tomcat安装目录下找到tomcat-user.xml 位于目录Tomcat 6.0\conf <?xml version1.0 encodingutf-8?> <tomcat-users> <role rolename"tomc…

mysql查询从周一开始算本周第一天

查询本周所有的数据&#xff08;本周第一天是周一&#xff09; SELECT * FROM task WHERE YEARWEEK(date_format(时间字段,%Y-%m-%d),1) YEARWEEK(now(),1); 查询本周所有的数据&#xff08;本周第一天是周日&#xff09; SELECT * FROM task WHERE YEARWEEK(date_format(时…