首页 web前端 js教程 虚拟 DOM:React 快速 DOM 更新背后的技术。

虚拟 DOM:React 快速 DOM 更新背后的技术。

Oct 21, 2024 pm 08:42 PM

大家好,我很高兴能够开始一系列新的帖子,我将尝试解释编程世界中的各种概念。我们将涵盖从幂等和惯用术语到与库和框架相关的更具体概念的所有内容。今天,我们将深入探讨这样一个主题 - 虚拟 DOM.

如果您觉得这有帮助,请不要忘记点赞、分享和评论您希望我接下来介绍哪些主题。我们不要再浪费时间了,直接跳到虚拟 DOM!

注意:在我们继续之前,重要的是要了解虚拟 DOM 的概念并不是 React 独有的。其他 JavaScript 前端库,例如 Vue,也使用它来增强渲染性能。

DOM

DOM(文档对象模型)是使用节点或对象的 HTML 文档(或网页/Web 应用程序)的树状表示。 DOM 的设计使得前端库和框架 (javascript) 可以通过其 API 以编程方式与文档交互和操作文档。

Virtual DOM: Technque behind React

为什么选择虚拟 DOM

虽然 DOM 提供了一种通过其 API 操作文档的有效方法,但当屏幕上有数千个元素时,性能可能会成为一个问题。这是因为 DOM 中的更新通常涉及销毁和重新创建整个子树。

这就是虚拟 DOM 发挥作用的地方。虚拟 DOM 是真实 DOM 的轻量级内存表示,允许快速有效地同步实际 DOM 的更改 - 这个过程称为协调。

Virtual DOM: Technque behind React

这里要记住的关键事项是:

  1. 虚拟 DOM 是 真实 DOM 的轻量级版本,这意味着它不具有真实 DOM 的所有属性,这使得它的使用效率更高。
  2. 虚拟 DOM 存在于内存中,允许在将更改应用到真实 DOM 之前进行更快、更高效的操作。

考虑到这一点,使用 DOM API 的 JavaScript 库创建自己的虚拟 DOM 并操作它。他们仅在必要时更新 Real DOM,即使如此,也只需最少的操作。

React 中如何处理虚拟 DOM?

React JS 是 Facebook 开发的一个用于构建用户界面的流行库。由于其简单性,它获得了广泛的流行并在许多现代 Web 项目中使用。

与许多其他 JS 前端库一样,React 使用虚拟 DOM 的概念来有效管理应用程序中的重新渲染和更新。

React 使用比较算法以及协调技术来优化此过程。 (具体来说,ReactDOM 库 在幕后处理此问题。)

让我们一步步分解:

  1. React 组件的 render() 函数

    • React 组件的 render() 函数首先使用 JSX 创建 React Element/Virtual DOM
    • 它包含 Real DOM 对应物的轻量级版本和额外属性,例如 $$typeofprops,以促进高效比较。
  2. 比较算法

    • 每当更新 React 组件时,就会创建一个新的 Virtual DOM,并开始比较过程。这是一个基于两个关键假设的 O(n) 启发式算法
      1. 不同类型的元素会产生不同的树。
      2. 关键道具可用于跟踪哪些子元素在渲染之间保持一致。

2.1。 比较算法的步骤

  • 当算法遇到两种不同类型的 DOM 元素:它将拆除旧的 Virtual DOM,并根据新元素的规范从头开始创建一个新的。
  • 当React遇到相同类型的DOM元素时:它保留旧的DOM对象,只更新更改的属性。
  • 对于 相同类型的 React 元素,React 会保持旧 DOM 对象完整并提供更新的 props。
  • 处理子元素时,React 会迭代两组子元素(旧的虚拟 DOM 树和新创建的树),在存在差异的地方进行更新。

2.2。 为什么要使用钥匙?

如上一点所述,比较算法会迭代子列表并在必要时进行更改。如果您不使用子列表中的键,性能可能会受到影响,并且您可能会遇到意外的行为。

让我们看一下示例:

<ul> // old list
  <li>apple</li>
  <li>pineapple</li>
</ul>

<ul> // new list
  <li>apple</li>
  <li>pineapple</li>
  <li>grape</li>
</ul>
登录后复制
登录后复制

在上述场景中,算法实际上可以有效地处理修改。它查看每个索引子项并找到

  • apple
  • &
  • 菠萝
  • 两个列表中的内容相同,并且对它们没有任何作用,而
  • grape>仅出现在新列表中,因此将一个添加到旧列表中。

    但是,我们想添加

  • 葡萄
  • 一开始。

    <ul> // old list
      <li>apple</li>
      <li>pineapple</li>
    </ul>
    
    <ul> // new list
      <li>apple</li>
      <li>pineapple</li>
      <li>grape</li>
    </ul>
    
    登录后复制
    登录后复制

    这里,当算法看到

  • 葡萄
  • 时,其性能将会下降。代替
  • 苹果
  • 苹果
  • 代替
  • 菠萝
  • 和一个新的
  • 菠萝
  • 在最后一个位置。从而重新创建 strach 中的所有元素。

    为了解决这个性能瓶颈,React 团队使用了 Key,它是附加到列表子项的唯一 ID,算法可以使用它来确定该项是否可以完好无损,并且只需重新排序位置或需要重新创建。

    <ul> // old list
      <li>apple</li>
      <li>pineapple</li>
    </ul>
    
    <ul> // new list
      <li>grape</li>
      <li>apple</li>
      <li>pineapple</li>
    </ul>
    
    登录后复制

    现在,React 可以使用 Key 属性,并且在添加新子项时仅重新定位未更新的子项。

    3) ReactDOM 的 render() 函数

    最后调用 ReactDOM 的 render() 函数,它协调了新的 Virtual DOM 和 Real DOM 之间的差异。这使得有效地重新渲染 HTML 所需的操作最少。

    结论

    在本文中,我们探索了虚拟 DOM,这是许多前端库使用的一种技术,可以通过最少的 DOM 操作有效地处理数据和元素更改。我们还研究了 React 如何具体使用差异和协调过程来优化更新。

    我希望这篇文章可以帮助您更好地了解虚拟 DOM 的工作原理。即使您熟悉这个概念,我也希望现在您知道什么是 Virtual DOM 以及它如何有助于创建优化的前端环境。

    以上是虚拟 DOM:React 快速 DOM 更新背后的技术。的详细内容。更多信息请关注PHP中文网其他相关文章!

    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    Video Face Swap

    Video Face Swap

    使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

    热门文章

    <🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
    3 周前 By 尊渡假赌尊渡假赌尊渡假赌
    北端:融合系统,解释
    4 周前 By 尊渡假赌尊渡假赌尊渡假赌
    Mandragora:巫婆树的耳语 - 如何解锁抓钩
    3 周前 By 尊渡假赌尊渡假赌尊渡假赌

    热工具

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    禅工作室 13.0.1

    禅工作室 13.0.1

    功能强大的PHP集成开发环境

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    热门话题

    Java教程
    1670
    14
    CakePHP 教程
    1428
    52
    Laravel 教程
    1329
    25
    PHP教程
    1274
    29
    C# 教程
    1256
    24
    Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

    Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

    从C/C到JavaScript:所有工作方式 从C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

    从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

    JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

    JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

    JavaScript在行动中:现实世界中的示例和项目 JavaScript在行动中:现实世界中的示例和项目 Apr 19, 2025 am 12:13 AM

    JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

    了解JavaScript引擎:实施详细信息 了解JavaScript引擎:实施详细信息 Apr 17, 2025 am 12:05 AM

    理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

    Python vs. JavaScript:社区,图书馆和资源 Python vs. JavaScript:社区,图书馆和资源 Apr 15, 2025 am 12:16 AM

    Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

    Python vs. JavaScript:开发环境和工具 Python vs. JavaScript:开发环境和工具 Apr 26, 2025 am 12:09 AM

    Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。

    C/C在JavaScript口译员和编译器中的作用 C/C在JavaScript口译员和编译器中的作用 Apr 20, 2025 am 12:01 AM

    C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

    See all articles