热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

react从入门到实践之react的虚拟DOM和Diff算法

一、react的虚拟DOM和Diff算法虚拟DOM和diff算法是React中非常核心的两个概念,我们需要对此有一个很全面的认知。这对于我们用脚手架开发项目,尤其是企业中前后端分离




一、react 的虚拟 DOM 和 Diff 算法


  1. 虚拟 DOMdiff算法是 React中非常核心的两个概念, 我们需要对此有一个很全面的认知。这对于我们用脚手架开发项目, 尤其是企业中前后端分离的项目(类似: 后台管理系统)等有很大的帮助。

  2. 对于虚拟 DOM的内部执行流程,如下所示:


  • Javascript 对象结构表示 DOM 树的结构;然后用这个树构建一个真正的 DOM 树,插到文档当中;
  • 当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较,记录两棵树差异;
  • 把步骤 2 所记录的差异应用到步骤 1 所构建的真正的 DOM树上,视图就更新了。

  1. 对于虚拟DOM的原理剖析,如下所示:

  • Virtual DOM 本质上就是在 JSDOM 之间做了一个缓存。可以类比 CPU 和硬盘,硬盘读取速度比较慢,我们会就在它们之间加缓存条;
  • 反之, 既然 DOM 运行速度慢,那么我们就在 JSDOM 之间加个缓存。JS 只操作 Virtual DOM,最后的时候再把变更的结果写入 DOM

  1. 对于 diff算法,如下所示:

  • 如果两棵树的根元素类型不同,React会销毁旧树,创建新树
  • 对于类型相同的React DOM 元素,React会对比两者的属性是否相同,只更新不同的属性; 当处理完这个 DOM 节点,React就会递归处理子节点。
  • 遍历插入元素, 如果没有 key, React将改变每一个子删除重新创建; 为了解决这个问题,React提供了一个 key 属性。当子节点带有key属性,React会通过 key 来匹配原始树和后来的树。

  1. 对于 diff 算法的执行过程,通过绑定 key, React就知道带有key '1024' 的元素是新的,对于 '1025''1026' 仅仅移动位置即可。

  2. 对于其中 key 的使用注意,如下所示:


  • key 属性只会在 React 内部使用,不会传递给组件
  • 在遍历数据时,推荐在组件中使用 key 属性,
  • {obj.t}
  • key 只需要保持与他的兄弟节点唯一即可,不需要全局唯一
  • 尽可能的减少数组 Index 作为 key,数组中插入元素的等操作时,会降低效率

  1. 对于 react 的虚拟 DOMDiff算法,可应用于九宫格案例,代码如下所示:




推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文详细介绍了 React 中的两个重要 Hook 函数:useState 和 useEffect。通过具体示例,解释了如何使用它们来管理组件状态和处理副作用。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 深入理解Vue.js:从入门到精通
    本文详细介绍了Vue.js的基础知识、安装方法、核心概念及实战案例,帮助开发者全面掌握这一流行的前端框架。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 探讨了如何解决Ajax请求响应时间过长的问题。本文分析了一个从服务器获取少量数据的Ajax请求,尽管服务器已经对JSON响应进行了缓存,但实际响应时间仍然不稳定。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
author-avatar
Mdh-103_230
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有