Reactjs react如何更新DOM的一部分?

Reactjs react如何更新DOM的一部分?,reactjs,virtual-dom,Reactjs,Virtual Dom,我知道这个问题显然已经讨论了很多,但我不确定如何研究我的问题,这是一个相当具体的问题,我希望它遵循这里的规则 我知道,要决定是否更新DOM,react会将虚拟DOM与重新渲染的DOM进行比较。但我只是不明白,万一它决定更新它,它是更新特定重新渲染组件的所有元素,还是只更新组件网中已更改的元素 提前感谢,更好地了解react决定如何重新渲染元素的一个好地方是 每次调用render()时,react将创建一个新的虚拟DOM,其中根节点是调用其渲染函数的组件。当组件或其任何子组件的状态发生更改时,将调

我知道这个问题显然已经讨论了很多,但我不确定如何研究我的问题,这是一个相当具体的问题,我希望它遵循这里的规则

我知道,要决定是否更新DOM,react会将虚拟DOM与重新渲染的DOM进行比较。但我只是不明白,万一它决定更新它,它是更新特定重新渲染组件的所有元素,还是只更新组件网中已更改的元素


提前感谢,

更好地了解react决定如何重新渲染元素的一个好地方是

每次调用render()时,react将创建一个新的虚拟DOM,其中根节点是调用其渲染函数的组件。当组件或其任何子组件的状态发生更改时,将调用render()函数。函数的作用是:从根节点开始销毁所有旧的虚拟DOM节点,并创建一个全新的虚拟DOM


为了确保组件的重新渲染平滑且高效,React使用将创建新树所需的时间减少到O(n)的时间复杂度,复制树的时间复杂度通常为>O(n^2)。它实现这一点的方法是在DOM中的每个元素上使用“key”属性。React知道,它可以检查DOM中每个节点上的“key”属性,而不是从头创建每个元素。这就是为什么如果不设置每个元素的“key”属性,React会得到警告,它会使用这些键大大提高渲染速度。

执行
render()
方法并不意味着React也会渲染实际的DOM。 React保留虚拟DOM的两个副本,即旧虚拟DOM和重新渲染的虚拟DOM,该虚拟DOM是在调用
render()
方法时创建的


render()
方法的输出是一个映射到DOM元素的javascript对象。当一个组件被改变时,我们得到一个新的元素。然后将重新呈现的虚拟DOM中的新react元素及其子元素与旧虚拟DOM中的元素及其子元素进行比较。如果发现任何差异,它将仅在发生更改的位置(例如按钮的文本已更改)更新真实DOM,而不更新整个真实DOM。如果没有发现差异,则不会触及真正的DOM。

这是一个过于简单的答案,但它应该回答您的问题。当状态更改时,整个应用程序树将重新呈现到虚拟dom中。然后将虚拟dom与上一个虚拟dom进行区分,并更改必要的dom元素。不管涉及到哪些组件来生成VDOM,React都不会在创建元素和它引用的DOM节点之间以一对一的方式显式使用键。随着光纤的引入,React使用光纤节点作为描述所需内容的元素与最终得到的DOM节点之间的关联。“render()函数将销毁从根开始的所有旧虚拟DOM节点,并创建一个全新的虚拟DOM。”我想确认这一点,但你能不能定位源代码,因为我在你提供的文档链接中没有找到确切的信息(换言之,我的理解是:如果元素树下的任何子元素被重新呈现,整个虚拟DOM都会从头开始重新创建)。