index.js:1446 Warning: Each child in a list should have a unique "key" prop.
react
key
, 而有的時候爲了方便咱們會直接把list 的索引指定成key
,可是這樣所並不被推薦,那這是爲何呢?咱們知道react的執行步驟通常是:算法
用state和jsx模板生成虛擬DOM,而後用虛擬DOM生成真實的 DOM,當咱們state發生變化時,render函數執行,生成新的 虛擬DOM,而後比較新舊虛擬DOM的區別,找到區別,而後直接操做DOM,改變有區別的內容,這樣比傳統的操做DOM,極大的提高了性能。數組
而虛擬DOM的核心就是——React
的diff算法
,要搞清楚這個問題咱們首先要來看看 diff算法函數
咱們從上圖能夠看出React 在更新虛擬DOM的時候是逐層往下的,也就是說第一層div時就有出現區別,那麼對比結束,直接更新真實DOM中對應的當前節點,以此類推。性能
key
了,假設咱們在state中有一個列表[A,B,C],在遍歷渲染時用索引做爲key,那麼就是這樣的.A 0
B 1
C 2
複製代碼
若是咱們執行一個操做,點擊刪除數組中的a, 咱們的列表就是[b,c],在遍歷渲染時仍然會用索引做爲key,結果以下:spa
如圖 ,咱們若是不用索引爲key , 程序能快速的對比出差別,反之也能對出差別,可是必須對比整個虛擬DOM, 這樣,程序仍然能正常執行,只不過大大消耗了新舊虛擬DOM的對比的性能,並可能致使組件狀態問題。code
能夠,可是不推薦這樣作,由於會大大消耗虛擬DOM的性能