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

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

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

让我们看一下示例:


    // old list
  • apple
  • pineapple
    // new list
  • apple
  • pineapple
  • grape

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

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

    但是,我们想添加

  • 葡萄
  • 一开始。
    
    
      // old list
    • apple
    • pineapple
      // new list
    • apple
    • pineapple
    • grape

    这里,当算法看到

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

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

    
    
      // old list
    • apple
    • pineapple
      // new list
    • grape
    • apple
    • pineapple

    现在,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
    JavaScript数据类型:浏览器和nodejs之间是否有区别?JavaScript数据类型:浏览器和nodejs之间是否有区别?May 14, 2025 am 12:15 AM

    JavaScript核心数据类型在浏览器和Node.js中一致,但处理方式和额外类型有所不同。1)全局对象在浏览器中为window,在Node.js中为global。2)Node.js独有Buffer对象,用于处理二进制数据。3)性能和时间处理在两者间也有差异,需根据环境调整代码。

    JavaScript评论:使用//和 / * * / * / * /JavaScript评论:使用//和 / * * / * / * /May 13, 2025 pm 03:49 PM

    JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

    Python vs. JavaScript:开发人员的比较分析Python vs. JavaScript:开发人员的比较分析May 09, 2025 am 12:22 AM

    Python和JavaScript的主要区别在于类型系统和应用场景。1.Python使用动态类型,适合科学计算和数据分析。2.JavaScript采用弱类型,广泛用于前端和全栈开发。两者在异步编程和性能优化上各有优势,选择时应根据项目需求决定。

    Python vs. JavaScript:选择合适的工具Python vs. JavaScript:选择合适的工具May 08, 2025 am 12:10 AM

    选择Python还是JavaScript取决于项目类型:1)数据科学和自动化任务选择Python;2)前端和全栈开发选择JavaScript。Python因其在数据处理和自动化方面的强大库而备受青睐,而JavaScript则因其在网页交互和全栈开发中的优势而不可或缺。

    Python和JavaScript:了解每个的优势Python和JavaScript:了解每个的优势May 06, 2025 am 12:15 AM

    Python和JavaScript各有优势,选择取决于项目需求和个人偏好。1.Python易学,语法简洁,适用于数据科学和后端开发,但执行速度较慢。2.JavaScript在前端开发中无处不在,异步编程能力强,Node.js使其适用于全栈开发,但语法可能复杂且易出错。

    JavaScript的核心:它是在C还是C上构建的?JavaScript的核心:它是在C还是C上构建的?May 05, 2025 am 12:07 AM

    javascriptisnotbuiltoncorc; saninterpretedlanguagethatrunsonenginesoftenwritteninc.1)javascriptwasdesignedAsalightweight,解释edganguageforwebbrowsers.2)Enginesevolvedfromsimpleterterterpretpreterterterpretertestojitcompilerers,典型地提示。

    JavaScript应用程序:从前端到后端JavaScript应用程序:从前端到后端May 04, 2025 am 12:12 AM

    JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。

    Python vs. JavaScript:您应该学到哪种语言?Python vs. JavaScript:您应该学到哪种语言?May 03, 2025 am 12:10 AM

    选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。

    See all articles

    热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

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

    热门文章

    热工具

    WebStorm Mac版

    WebStorm Mac版

    好用的JavaScript开发工具

    SublimeText3 Linux新版

    SublimeText3 Linux新版

    SublimeText3 Linux最新版

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    Atom编辑器mac版下载

    Atom编辑器mac版下载

    最流行的的开源编辑器

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具