這就要從react如何渲染出頁面開始 一般狀況下的步驟是這樣react
這個是在state不發生變化的狀況下,(state或者prop發生變化都會調用render函數,從新渲染頁面)算法
state數據變化時,一般理解下應該是下面的步驟瀏覽器
這樣能夠實現,可是很是消耗性能,由於會渲染兩次dom樹,因此react就採用一種虛擬dom的方法來進行dom更新。bash
JSX轉成dom流程dom
用JSX語法時,渲染dom的流程:JSX——JS dom描述對象——真實dom函數
具體步驟:性能
['div',{id:'a'},['span',{},'hello']]
複製代碼
<div id='a'><span>hello</span></div>
複製代碼
['div',{id:'a'},['span',{},'hi']]
複製代碼
在瀏覽器中能夠用虛擬dom生成真實dom顯示,在原生應用中也能夠用虛擬dom生成對應的方式來顯示頁面spa
在上面咱們介紹了react中state變化時,dom是如何發生變化的,在第七步中比較原始虛擬dom和新的虛擬dom的區別採用的方法,就是diff算法(diffrence)code
虛擬dom在何時會發生比對?沒錯,數據發生變化時,也就是調用setState時cdn
react的虛擬dom實際上是同級比較的
如上圖 他的對比步驟以下但凡在上面哪一步驟出現不一樣,就再也不繼續比對,而是刪除下面的所有節點,採用新的虛擬dom(例如:若是紅色框的原始虛擬dom和新的虛擬dom不一致,那麼就不在進行比對,採用新的虛擬dom來生成dom)
react利用key來識別組件,它是一種身份標識標識,來提升虛擬dom的比對速度看下面
好比我要在abcde中添加一個f若是咱們沒有key值,那咱們就須要A比對一遍,B對比一遍,以此類推很好性能,而有了key,就像下面的圖同樣,咱們很快就知道只有f與以前不一樣,提升了列表渲染的性能