react中key的作用

背景:

如果爲父節點添加多個相同的子節點時,不添加key屬性,會報錯但同時也會渲染出dom,渲染出dom其實是證明能從差異對象中渲染出真實dom,但報錯的原因是因爲這種寫法會影響渲染的性能,不利於生層dom節點。

作用:

key的作用主要是用來減少沒必要的diff算法對比,因爲對於一個組件或者節點來說,只要父節點狀態或者屬性發生變化,該組件就會進行diff對比,即使該組件沒變化,而如果爲組件引入了key值,就可以在diff對比前先做一個校驗,判斷該組件是否需要diff對比,即使是diff對比,也可以判斷該組件是直接更新操作還是銷燬或者新建操作,從而提高了diff算法的效率;

特別在渲染同級同結構的組件們時,key可以爲它們加上了身份的標誌,在rerender時,可以通過key來判斷該組件是否已經存在,是否需要跟新或者銷燬,新建等操作,提高了diff算法在同級節點上的操作。

原理:

因爲在reactelement中有一個屬性是key,該屬性默認是爲空值,所以一般情況下,只要組件不加上key值,react是不會去校驗組件的key,而是直接採用diff算法進行對比,一旦組件加上了key值,react就會在渲染時對該組件的身份進行校驗,首先校驗新舊組件的key值是不是一致,不一致的話,該組件直接銷燬,然後在新建該組件;如果一致,則比較組件的屬性是否發生變化,如果發生變化,則採用diff算法進行對比,然後得出差異對象,如果屬性沒發生變化,則認爲該組件不需要改變;

大概的流程圖:

clipboard.png

  • key相同:若組件屬性有所變化,則react只更新組件對應的屬性;沒有變化則不更新。
  • key值不同:則react先銷燬該組件,然後重新創建該組件。

用法:

(一般同級同結構的子節點都需要採用key屬性,方便diff算法的使用)

  • 純靜態的同級同結構節點的渲染,可以採用index作爲key的值,因爲這裏不需要動態去變化節點裏面的內容的值;
  • 對於一組動態變化的數組來說,採用index作爲key的值,會有可能出現問題,因爲index的值和數組內的元素內容不具有關聯性,所以即使採用了index作爲key,子組件的內容有可能不會隨着屬性的變化而發生變化(只要組件內該元素不與屬性構成聯繫),所以一般採用數組中元素的某一個唯一值作爲key,這樣一來,只要統一位置的節點的key值不一致,就會直接銷燬和新建而不是直接更新;
  • 對於一個不想受到父組件屬性狀態影響而導致沒必要的渲染的組件,可以採用key值,因爲只要key值不發生改變,組件的屬性不變,即使父組件渲染,該組件也不會發生變化,只有組件的狀態或者屬性發生變化,組件纔會二次渲染;一旦key值變化,就直接組件銷燬然後再新建該組件。

以上就是我對react中key的認識和了解,雖然沒有過多的深入研究react裏面關於key的源碼分析,但通過這篇博客,也會一定程度上對react的key有更深入的認識,若有不正確的地方,歡迎指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章