React 如何更新 DOM 的一部分?

How does react update part of the DOM?

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

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

提前致谢,

reconciliation documentation 是更好地理解 React 如何决定重新渲染元素的好地方,但我可以总结一下:

每次调用 render() React 都会创建一个新的虚拟 DOM,其中根节点是调用渲染函数的组件。当状态 组件或其任何子项的道具发生变化时,将调用 render() 函数。 render() 函数从根开始销毁所有旧的虚拟 DOM 节点并创建一个全新的虚拟 DOM。

为了保证组件的重新渲染流畅高效,React使用Diffing Algorithm将创建一棵新树的时间减少到O(n)的时间复杂度,通常复制树的时间复杂度 > O(n^2)。它实现这一点的方法是在 DOM 中的每个元素上使用 "key" 属性。 React 知道与其从头开始创建每个元素,不如检查 DOM 中每个节点的 "key" 属性。这就是为什么如果你不设置每个元素的 "key" 属性你会收到警告,React 使用键来大大提高它的渲染速度。

render() 方法的执行并不意味着 react 也会渲染实际的 DOM。 React 保留了虚拟 DOM 的两个副本,即旧虚拟 DOM 和 re-rendered 虚拟 DOM,后者在调用 render() 方法时创建。

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