最近發現個問題,就是table渲染的時候竟然會多出來一條上次的數據,關鍵在render渲染前還打印了數據是對的,但是一看頁面傻眼了,然后發現了這是antd的一個bug,記錄下,希望幫我一樣遇到這樣問題的人。
按照 React 的規范,所有的組件數組必須綁定 key。在 Table 中,dataSource 和 columns 里的數據值都需要指定 key 值。對於 dataSource 默認將每列數據的 key 屬性作為唯一的標識。最后發現是由於設置的rowKey不是唯一的問題造成了此bug.
說到這我們來說說key的作用吧。
react中的key屬性,它是一個特殊的屬性,有了key屬性后,就可以與組件建立了一種對應關系,簡單說,react利用key來識別組件,他是一種身份標識,就像每個人有一個身份證來做辨識一樣。每個key 對應一個組件,相同的key react認為是同一個組件,這樣后續相同的key對應組件都不會被創建
key值相同
如果兩個元素是相同的key,且滿足第一點元素類型相同, 若元素屬性有所變化,則React只更新組件對應的屬性,這種情況下,性能開銷會相對較小
key值不同
在render函數執行的時候,新舊兩個虛擬DOM會進行對比,如果兩個元素有不同的key,那么在前后兩次渲染中就會被認為是不同的元素,這時候舊的那個元素會被unmount,新的元素會被mount
【解決辦法】
1.設置rowKey屬性,指定值為唯一的字段(確保是唯一不會重復)
2.設置columns屬性的配置中的key(好像主要是第一列),指定值為唯一的字段
好了問題解決了,我們來梳理下rowKey吧,在開發中使用antd的Table組件時,經常還有warning提示,如下!
就是托我們的rowKey使用不當導致,設置了rowKey屬性,但所指定字段的值不是唯一的或者直接沒設置,希望其他朋友也能重視這個問題,以保證代碼開發的性能優化和避免像我這樣不起眼但是也很意外的bug,祝個人永無bug