热门标签 | 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算法,可应用于九宫格案例,代码如下所示:




推荐阅读
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • 本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 本文介绍了两个重要的Node.js库——cache-content-type和mime-types,它们在处理HTTP响应头时非常有用。cache-content-type是基于mime-types构建的,并且实现了缓存机制以提高性能。 ... [详细]
  • 本文详细记录了一位Java程序员在Lazada的面试经历,涵盖同步机制、JVM调优、Redis应用、线程池配置、Spring框架特性等多个技术点,以及高级面试中的设计问题和解决方案。 ... [详细]
  • 本文介绍了Linux内核中TCP的三种接收队列:Prequeue、sk_receive_queue和Backlog。这些队列在数据包处理过程中扮演着重要角色,帮助提高系统性能和效率。 ... [详细]
  • Redis: 高效的键值存储系统
    Redis是一款遵循BSD许可的开源高性能键值存储系统,它不仅支持多种数据类型的存储,还提供了数据持久化和复制等功能,显著区别于其他键值缓存解决方案。 ... [详细]
  • 本文详细记录了一位求职者在搜狐进行的两次面试经历,包括面试的具体时间、面试流程、技术问题及个人感受。通过本次面试,作者不仅获得了宝贵的经验,还成功拿到了搜狐的录用通知。 ... [详细]
  • RabbitMQ 核心组件解析
    本文详细介绍了RabbitMQ的核心概念,包括其基本原理、应用场景及关键组件,如消息、生产者、消费者、信道、交换机、路由键和虚拟主机等。 ... [详细]
  • Web开发实践:创建连连看小游戏
    本文详细介绍了如何在Web环境中开发一款连连看小游戏,适合初学者和技术爱好者参考。通过本文,您将了解游戏的基本结构、连线算法以及实现方法。 ... [详细]
  • SPFA算法详解与应用
    当图中包含负权边时,传统的最短路径算法如Dijkstra不再适用,而Bellman-Ford算法虽然能解决问题,但其时间复杂度过高。SPFA算法作为一种改进的Bellman-Ford算法,能够在多数情况下提供更高效的解决方案。本文将详细介绍SPFA算法的原理、实现步骤及其应用场景。 ... [详细]
  • 函子(Functor)是函数式编程中的一个重要概念,它不仅是一个特殊的容器,还提供了一种优雅的方式来处理值和函数。本文将详细介绍函子的基本概念及其在函数式编程中的应用,包括如何通过函子控制副作用、处理异常以及进行异步操作。 ... [详细]
  • publicclassBindActionextendsActionSupport{privateStringproString;privateStringcitString; ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • 深入探讨:React中的方法绑定技巧与性能考量
    本文详细介绍了在React应用中绑定方法的三种常见方式及其对性能的影响,包括在JSX中使用箭头函数、在构造函数中绑定this以及将类方法定义为箭头函数的方法。 ... [详细]
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社区 版权所有