React組件開發(fā)小記(一)—— 組件的key

    2017年年后嘶朱,團隊決定棄jQuery晕窑,將技術棧切到了React全家桶。筆者從業(yè)經驗少,在技術切換的過程中,邊學邊用,踩過很多坑,曾經因為小問題將自己繞的暈暈乎乎的开睡,也因此積累了一點經驗。因此決定將過去六個月中遇到的問題苟耻,學到的經驗以文章的形式記錄下來篇恒。在接下來團隊進一步擴大應用的過程中,仍然會繼續(xù)記錄凶杖。由于我本身就是新手胁艰,所以如果有看到的大神準備好了搬磚,請輕拍智蝠。

    先從React基礎開始腾么,不涉及Redux。文章會用幾個小栗子來說明用到的知識點杈湾。項目會用Es6來寫React組件解虱,也會用到AntDesign。

(一)組件的key漆撞。

     先從一個常見的警告開始吧殴泰。

“ Warning:Each child in an array or iterator should have a unique "key" prop. Check the render method of `App`. See https://fb.me/react-warning-keys for more information.”

    上面這個警告想必每個剛開始寫React的童鞋遇到過于宙。警告的意思是,你沒有給React組件寫一個叫“key”的屬性值悍汛。這個報錯通常出現(xiàn)在對后端返回的數(shù)組進行map遍歷捞魁,然后生成一個個列表項。而React規(guī)范中离咐,每一個組件都要有一個唯一的key值谱俭。
    解決這個問題也很好辦,就是指定key宵蛀。很多情況會直接使用map方法的第二個參數(shù)index作為組件的key昆著。其實這是一種不推薦的寫法。最好的key值是應該使用返回數(shù)據中的唯一標識來做組件的key(如果后端沒有給你返回類似Id术陶,key這種唯一標志性宣吱,當我沒說)。
    為什么這么推薦瞳别?
    首先要明白,為什么組件要有唯一標識key值杭攻。React是根據組件上設定的key屬性來生成該組件祟敛,只有key改變了,React才會更新組件兆解,否則重用該組件馆铁。
     key相同,若組件屬性有所變化锅睛,則react只更新組件對應的屬性埠巨;沒有變化則不更新。 key值不同现拒,則react先銷毀該組件辣垒,然后重新創(chuàng)建。如果使用了index作為key值印蔬,這個index并沒有和返回的數(shù)據列表做一一對應勋桶,相當于是用了一個隨機值,本來這一項數(shù)據沒有改變侥猬,React組件可以被重用例驹,但是用了隨機值,組件會重新渲染退唠。
    如果有兩個組件有相同的key值鹃锈,React則根據key認為兩個組件是完全相同的,后一個組件會被拋棄掉瞧预。

    React的diff算法分為tree diff屎债,component diff和element diff仅政。在element diff中算法中,通過key進行算法優(yōu)化扔茅。
    當節(jié)點處于同一層級時已旧,React diff 有三種節(jié)點操作,分別為:插入召娜、移動和 刪除运褪。
     如果沒有key碘耳,假設老集合中包含節(jié)點:A陡蝇、B、C棋蚌,更新后的新集合中包含節(jié)點:B雅倒、C璃诀、A,此時新老集合進行對比蔑匣,發(fā)現(xiàn) B !== A劣欢,則創(chuàng)建B插入到集合,刪除老集合 A裁良;以此類推凿将,創(chuàng)建并插入C、A价脾,刪除 B牧抵、C。
    節(jié)點很多的話侨把,這樣的操作會很消耗性能犀变。更加合理的方式是進行移動操作。
  key存在秋柄,通過 key 發(fā)現(xiàn)新老集合中的節(jié)點都是相同的節(jié)點获枝,只需要將老集合中節(jié)點的位置進行移動,更新為新集合中節(jié)點的位置华匾。則可以把B和C移動到A的前面映琳。
    唯一的key屬性不會顯性優(yōu)化性能,但是對React內部是有利的蜘拉。
  
    下一篇聊聊React的數(shù)據原則:誰持有萨西,誰消費。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末旭旭,一起剝皮案震驚了整個濱河市谎脯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌持寄,老刑警劉巖源梭,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娱俺,死亡現(xiàn)場離奇詭異,居然都是意外死亡废麻,警方通過查閱死者的電腦和手機荠卷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烛愧,“玉大人油宜,你說我怎么就攤上這事×耍” “怎么了慎冤?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沧卢。 經常有香客問我蚁堤,道長,這世上最難降的妖魔是什么但狭? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任披诗,我火速辦了婚禮,結果婚禮上立磁,老公的妹妹穿的比我還像新娘藤巢。我一直安慰自己,他們只是感情好息罗,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著才沧,像睡著了一般迈喉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上温圆,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天挨摸,我揣著相機與錄音,去河邊找鬼岁歉。 笑死得运,一個胖子當著我的面吹牛,可吹牛的內容都是我干的锅移。 我是一名探鬼主播熔掺,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼非剃!你這毒婦竟也來了置逻?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤备绽,失蹤者是張志新(化名)和其女友劉穎券坞,沒想到半個月后鬓催,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡恨锚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年宇驾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猴伶。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡课舍,死狀恐怖,靈堂內的尸體忽然破棺而出蜗顽,到底是詐尸還是另有隱情布卡,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布雇盖,位于F島的核電站忿等,受9級特大地震影響,放射性物質發(fā)生泄漏崔挖。R本人自食惡果不足惜贸街,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狸相。 院中可真熱鬧薛匪,春花似錦、人聲如沸脓鹃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘸右。三九已至娇跟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間太颤,已是汗流浹背苞俘。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留龄章,地道東北人吃谣。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像做裙,于是被迫代替她去往敵國和親岗憋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容