React 中的虚拟 DOM 及其实现方式详解

阅读时长 5 分钟读完

React 是当前前端领域中最受欢迎的 JavaScript 框架之一,它采用高效的虚拟 DOM 技术,使得数据的变化只需要局部更新 DOM,从而避免了传统 DOM 操作的性能问题。本文将对 React 中的虚拟 DOM 进行详细的解释,并介绍其实现方式,同时提供示例代码供读者参考。

什么是虚拟 DOM

虚拟 DOM 是一种将 DOM 抽象成 JavaScript 对象的技术,即使用一棵以 JavaScript 对象为节点的树来描述真正的 DOM 结构,这棵树就被称为虚拟 DOM。

每当数据发生变化时,React 首先会对比新旧虚拟 DOM 的差异,然后根据差异进行局部 DOM 更新,从而最大限度地减少 DOM 操作,提高页面渲染性能。

虚拟 DOM 的实现方式

虚拟 DOM 的实现方式可以分为以下步骤:

  1. 创建虚拟 DOM:使用 JavaScript 对象来描述真正的 DOM 结构,将其存储在内存中,这些虚拟 DOM 被称为 Virtual Node(VN)。
  2. 构建真正的 DOM 树:使用创建好的虚拟 DOM,递归构建一棵真正的 DOM 树。这个过程可以通过递归遍历所有 Virtual Node,并使用 DOM API 创建相应的真实 DOM 节点来完成。
  3. 将修改的虚拟 DOM 和旧的虚拟 DOM 进行比较:当某个组件的状态数据发生变化时,React 会调用虚拟 DOM 的 diff 算法,比较修改后组件的 Virtual Node 和旧的 Virtual Node 的差别,得到需要更新的节点集合。
  4. 仅对修改了的节点进行更新:将需要更新的节点集合应用到真实的 DOM 上,只更新需要变化的部分。

React 的虚拟 DOM 技术带来的好处是,由于需要更新的节点只有一部分,更新效率高,因此能够让大部分的页面变化变得十分流畅,同时也带来了更加优雅的开发模式。

示例代码

下面是一个使用 React 实现的示例代码,代码实现了一个简单的 todo list:

-- -------------------- ---- -------
----- -------- ------- --------------- -
  ------------------ -
    -------------
    ---------- - - ------ --- ----- -- --
    ----------------- - -----------------------------
    ----------------- - -----------------------------
  -

  -------- -
    ------ -
      -----
        -------------
        ------------- ------------------------ --
        ----- -----------------------------
          ------ ---------------------------- ----------------------- --
          ----------- ------------------------- - -----------
        -------
      ------
    --
  -

  --------------- -
    --------------- ----- -------------- ---
  -

  --------------- -
    -------------------
    -- ------------------------- -
      -------
    -
    ----- ------- - -
      ----- ----------------
      --- ----------
    --
    ------------------- -- --
      ------ ----------------------------
      ----- --
    ----
  -
-

----- ------------ ------- --------------- -
  -------- -
    ------ -
      ----
        -------------------------- -- -
          --- ------------------------------
        ---
      -----
    --
  -
-

------------------------- --- ---------------------------------

在这段代码中,我们使用了 React.Component 类创建了一个组件 TodoList,同时将该组件渲染到根节点(即 document.getElementById('root'))中。该组件的状态包括一个待办事项列表 items 以及一个输入框 text,当用户在输入框中输入内容并按下回车时,会将最新的待办事项添加到列表中。

我们可以通过查看页面源代码,来了解虚拟 DOM 是如何优化真实 DOM 操作的。在 Chrome 终端中输入 document.getElementsByTagName('ul')[0].outerHTML,就可以查看到当前 todo list 中的列表节点的 HTML 代码。可以发现,我们在输入框中输入内容并按下回车时,仅更新了列表中新增的那一条数据,而不是整体重新渲染待办事项列表,这也正是虚拟 DOM 的作用所在。

总结

虚拟 DOM 是 React 框架中的核心技术之一,实现了数据与界面之间的完全分离,能够最大程度地减少 DOM 操作,从而提高页面渲染性能。通过本文的阅读,希望读者能够理解 React 虚拟 DOM 的机制,并掌握其实现方式。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648d7e1e48841e9894bca7a5

纠错
反馈