React將下一個虛擬DOM與以前的虛擬DOM進行比較,並且只在它們不同時應用更新。
React對於真正的DOM的任何直接變化都是無知的。如果它不在react的虛擬DOM中,那麼反應並不知道它。
Codepen here用 - 排序 - 概念證明,含有按鈕來更改狀態,請直接DOM更新和重新渲染:
代碼段從codepen:
illegalUpdate() {
// Illegal direct DOM update,
// to check whether component is destroyed after re-render
document.getElementById("id1").style.backgroundColor = "red";
}
render() {
...
return (
<div>
{component1}
{component2}
<p><button onClick ={() => this.illegalUpdate()}>
</div>
);
}
摘要:
- 您可以非法將組件的真實DOM顏色從綠色變爲紅色,然後重新渲染。
- 組件顏色保持紅色(即使組件的代碼將顏色設置爲綠色)
- 反應不知道在實際DOM中所做的更改。
- react將新的虛擬DOM與舊的虛擬DOM進行比較。
- 在這兩個顏色是綠色的。
- 所以沒有更新:顏色保持紅色。
進一步實驗: - 如果從法律上改變p組件的類型以H1或反之亦然,反應將取代整個DOM元素。那麼組件會再次呈現綠色。
爲了進一步閱讀,您還可以查看react page on advanced performance,同時對組件樹(包括角色shouldComponentUpdate
)的虛擬dom和渲染有很好的解釋。
據我所知,它是比較舊的虛擬DOM到'下一個'虛擬DOM。 – azium
然後在獲得「diff」之後,將這些更改應用於實際的DOM? – CADBOT
這是正確的。 – azium