寫 Vue 或 React 項(xiàng)目時(shí)要在列表組件中寫 key 的原因及作用

原因:
Vue 和 React 都是采用diff算法來(lái)對(duì)比新舊虛擬dom節(jié)點(diǎn)去更新節(jié)點(diǎn)的吴侦。
在 Vue 的 diff 函數(shù)交叉對(duì)比中浴井,當(dāng)新節(jié)點(diǎn)和舊節(jié)點(diǎn)交叉對(duì)比沒有結(jié)果時(shí)音羞,會(huì)根據(jù)新節(jié)點(diǎn)的 key 去對(duì)比舊節(jié)點(diǎn)數(shù)組中的 key鞭执,從而找到相對(duì)應(yīng)的節(jié)點(diǎn)膛檀,如果沒有找到就認(rèn)為是一個(gè)新增節(jié)點(diǎn),而如果沒有 key斟赚,就會(huì)采用遍歷方式去查找對(duì)應(yīng)的舊節(jié)點(diǎn)着降。
當(dāng) Vue 正在更新使用 v-for 渲染的元素列表時(shí),它默認(rèn)使用“就地復(fù)用”的策略拗军。如果數(shù)據(jù)項(xiàng)的順序被改變任洞,Vue 將不會(huì)移動(dòng) DOM 元素來(lái)匹配數(shù)據(jù)項(xiàng)的順序蓄喇,而是簡(jiǎn)單復(fù)用此處每個(gè)元素。并且確保它們?cè)诿總€(gè)索引位置正確渲染交掏。這個(gè)默認(rèn)的模式是高效的妆偏,但是只適用于不依賴子組件狀態(tài)或臨時(shí)DOM狀態(tài)(例如:表單輸入值)的列表渲染輸出。在沒有綁定key 且遍歷模板簡(jiǎn)單的情況下盅弛,會(huì)導(dǎo)致新舊虛擬節(jié)點(diǎn)對(duì)比高效钱骂,節(jié)點(diǎn)也會(huì)復(fù)用,而這種復(fù)用就是“就地復(fù)用”挪鹏。

作用:
1.避免對(duì)節(jié)點(diǎn)“就地復(fù)用”见秽。需要修改的節(jié)點(diǎn)位置沒有變,是內(nèi)容更新了讨盒,這雖然提高了復(fù)用性能解取,但是往往在復(fù)雜的表單中會(huì)導(dǎo)致狀態(tài)出現(xiàn)錯(cuò)位,也不會(huì)產(chǎn)生過渡效果催植。帶有 key 就不會(huì)使用“就地復(fù)用”了肮蛹,在 sameNode 函數(shù) a.key===b.key 對(duì)比中就可以避免“就地復(fù)用”的情況。
2.在有 key 的情況下增加準(zhǔn)確性创南,key 相當(dāng)于每個(gè) Vnode 的唯一 id伦忠,我們可以依靠 key,更快更精確的知道 oIdVnode中 對(duì)應(yīng)的 Vnode 節(jié)點(diǎn)稿辙。利用 key 的唯一性生成 map 對(duì)象來(lái)獲取相對(duì)應(yīng)的節(jié)點(diǎn)昆码,比遍歷方式更快。

“就地復(fù)用”的解釋:
如果數(shù)據(jù)項(xiàng)的順序被改變邻储,Vue 將不會(huì)移動(dòng) DOM 元素來(lái)匹配數(shù)據(jù)項(xiàng)的順序赋咽,而是簡(jiǎn)單復(fù)用此處每個(gè)元素。

這句話比較難理解吨娜,看下邊這個(gè)例子:

首先文本脓匿,輸入框,按鈕是寫在一個(gè) div 里面宦赠。


描述代碼

在“就地復(fù)用”策略中陪毡,點(diǎn)擊按鈕,輸入框不隨文本一起下移勾扭,是因?yàn)檩斎肟驔]有與數(shù)據(jù)(data)綁定毡琉,所以 vuejs默認(rèn)使用已經(jīng)渲染的 DOM,然而文本與數(shù)據(jù)是綁定的,所以文本被重新渲染妙色,這種處理方式在 Vue 或者 Angularjs都是默認(rèn)的列表渲染策略桅滋,因?yàn)楦咝А?/p>

這種“就地復(fù)用”一般在“列表展示”的場(chǎng)景中不會(huì)出現(xiàn)問題,所以我的建議是:如果你的列表元素存在與用戶交互的場(chǎng)景(比如form表單或者重新排序等)身辨,那么請(qǐng)你為 v-for 指令設(shè)置 key 參數(shù)丐谋,key 指向列表中每個(gè)元素的唯一值芍碧。

官方解釋:
“就地復(fù)用”的模式是高效的,但是只適用于不依賴子組件狀態(tài)或臨時(shí) DOM 狀態(tài)(例如:表單輸入值)的列表渲染輸出号俐。

注意點(diǎn)擊下移按鈕后的變化
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末师枣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子萧落,更是在濱河造成了極大的恐慌,老刑警劉巖洗贰,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件找岖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡敛滋,警方通過查閱死者的電腦和手機(jī)许布,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绎晃,“玉大人蜜唾,你說(shuō)我怎么就攤上這事∈” “怎么了袁余?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)咱揍。 經(jīng)常有香客問我颖榜,道長(zhǎng),這世上最難降的妖魔是什么煤裙? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任掩完,我火速辦了婚禮,結(jié)果婚禮上硼砰,老公的妹妹穿的比我還像新娘且蓬。我一直安慰自己,他們只是感情好题翰,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布恶阴。 她就那樣靜靜地躺著,像睡著了一般遍愿。 火紅的嫁衣襯著肌膚如雪存淫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天沼填,我揣著相機(jī)與錄音桅咆,去河邊找鬼。 笑死坞笙,一個(gè)胖子當(dāng)著我的面吹牛岩饼,可吹牛的內(nèi)容都是我干的荚虚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼籍茧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼版述!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起寞冯,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤渴析,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后吮龄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俭茧,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年漓帚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了母债。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尝抖,死狀恐怖毡们,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昧辽,我是刑警寧澤衙熔,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站奴迅,受9級(jí)特大地震影響青责,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜取具,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一脖隶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暇检,春花似錦产阱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至悔据,卻和暖如春庄敛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背科汗。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工藻烤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓怖亭,卻偏偏與公主長(zhǎng)得像涎显,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兴猩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容