引擎盖下的 React Virtual Dom

Posted

技术标签:

【中文标题】引擎盖下的 React Virtual Dom【英文标题】:React Virtual Dom under the hood 【发布时间】:2018-03-03 13:39:23 【问题描述】:

我从消息来源中了解到,如果我更新任何组件的状态而不是整个 virtual dom 将被渲染?是真的吗?如果是,那为什么不调用所有组件的渲染方法?

另外,需要澄清以下几点 -

Virtual Dom 实际上是什么?有什么实际的例子吗?

我假设如果我们将虚拟 dom 与实际 dom 进行比较,虚拟 dom 更新 dom 所需的时间比真实 dom 少。但是如何实际证明这一点呢?

react 如何使用 diffing algorithm 仅更新相应的组件 发生变化的地方(如果我使用 setState 方法)

非常感谢任何视频讲座。

【问题讨论】:

I've read from the sources… — 你在哪里读到的?什么来源?为什么不包括在你的问题中? 【参考方案1】:

不,您阅读的内容不正确。

当您更新组件的状态时,意味着您更改了虚拟 DOM 的一部分,您只会更改 React 虚拟 DOM 的特定部分,而不会更改其他任何内容。

所有其他组件都不会重新渲染。

回答您的问题:

    虚拟 DOM 是纯 javascript 对象中实际 DOM 的表示。有关什么是虚拟 DOM 的全面详细信息,请参阅此 *** question 和此 medium article

    就效率而言,操作真实的 DOM 确实非常昂贵。另一方面,虚拟 DOM 非常高效。这里有几篇文章可以帮助您了解如何:Codecademy 和 Medium article

    Codecademy 解释了 diffing algorithm 的工作原理,但您也可以阅读以下内容以获取有关上述算法的更多信息 React's official documentation。

我相信我在这里找到并列出的文章足以了解虚拟DOM虚拟DOM和真实DOM的性能差异以及如何差异算法有效

【讨论】:

【参考方案2】:

如果某个组件的 state 或 props 发生了变化,那么这个组件和它的子组件都会被重新渲染,也就是说——所有这些组件的 render 方法都会被调用。如果你想知道为什么你的组件的 render 方法没有被调用,请插入你的 sn-p 代码。

回答您的子问题:

    虚拟 dom 只是真实 dom 的代表。虚拟领域 object 只是普通的 js 对象,它完全反映了一些 真正的 dom 元素。 是的,你是对的。比较两个 js 对象(虚拟 dom)比比较两个 dom 元素要便宜得多。 React 使用复杂的 O(n) 算法来比较两个虚拟 dom 树。你不应该真正考虑这个,它是关于深入研究数学问题。

【讨论】:

以上是关于引擎盖下的 React Virtual Dom的主要内容,如果未能解决你的问题,请参考以下文章

Python 是不是优化了引擎盖下的字典查找?

pydub append - 引擎盖下行为的澄清

如果找不到匹配项,replace 会做啥? (引擎盖下)

Visual Studio - 引擎盖下(NPM/Typescript)

Nuxt apollo 智能查询被调用了两次。引擎盖下会发生啥?

引擎盖下的网络浏览器的工作历史