vue中:key的作用

可以唯一的確定一個DOM元素,讓diff算法更加高效

<body>
    <div id='app'>
        <p v-for='item in items' :key='item'>{{item}}</p>
    </div>
    <script>
        var vm = new Vue({
            el:'#app'
            data:{
                items:['a','b','c','d','e']
             }
             mounted(){
                 setTimeout(()=>{
                     // 在c的前邊添加一個f
                     this.items.splice(2,0,'f')
                 },2000)
             }
        })
    </script>
</body>

上邊案例重現(xiàn)的是以下過程

img

不使用key瘾敢,則 diff 算法默認是這樣的:

img

即把C更新成F祝辣,D更新成C,E更新成D涧团,最后再插入E只磷,是不是很沒有效率? 更新了3次泌绣,之后做了一次創(chuàng)建插入的操作
所以我們需要使用key來給每個節(jié)點做一個唯一標識钮追,Diff算法就可以正確的識別此節(jié)點,找到正確的位置區(qū)插入新的節(jié)點阿迈。

img

只使用了一次創(chuàng)建追加的操作

使用key

//首次循環(huán) patch A
A B C D E
A B F C D E

//第二次循環(huán) patch B
B C D E
B F C D E

//第三次循環(huán) patch E(首位找到相同節(jié)點)
C D E
F C D E

//第4次循環(huán) patch D
C D 
F C D 

//第5次循環(huán) patch C
C 
F C  

//oldCh全部處理結(jié)束元媚,newCh中剩下F,創(chuàng)建F并插入到C前邊

結(jié)論:

  1. key 的作用主要是 為了實現(xiàn)高效的更新虛擬 DOM苗沧,提高性能刊棕。其原理是vue在patch的過程中通過key可以精準的判斷兩個節(jié)點是否是同一個,從而避免頻繁的更新元素崎页,使得整個patch過程更加高效鞠绰,減少DOM操作量,提高性能飒焦。

  2. 另外蜈膨,若不設置key,還可能在列表更新時引發(fā)一些隱蔽的bug牺荠。例如:

img

點擊第二項的delete翁巍,

img

原因很簡單,你認為你刪除了2休雌,但Vue會認為你做了兩件事:

  • 把2變成了3
  • 然后把3刪除了
image.png
  1. vue在使用相同的標簽名元素的過渡切換時灶壶,也會使用到key屬性,其目的也是為了讓vue可以區(qū)分它們杈曲,否則vue只會替換其內(nèi)部屬性而不會觸發(fā)過渡效果驰凛。

借用官方文檔上的例子:

<transition>
  <span :key="text">{{text}}</span>
</transition>

這里如果text發(fā)生改變,整個<span>元素會發(fā)生更新担扑,因為當text改變時恰响,這個元素的key屬性就發(fā)生了改變,在渲染更新時涌献,Vue會認為這里新產(chǎn)生了一個元素胚宦,而老的元素由于key不存在了,所以會被刪除,從而觸發(fā)了過渡枢劝。

假如沒有key屬性:

<transition>
  <span>{{text}}</span>
</transition>

那么當text改變時井联,Vue會復用元素,只改變<span>元素的內(nèi)容您旁,而不會有新的元素被添加進來烙常,也不會有舊的元素被刪除。

同理被冒,key屬性被用在組件上時军掂,當key改變時會引起新組件的創(chuàng)建和原有組件的刪除,此時組件的生命周期鉤子就會被觸發(fā)昨悼。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蝗锥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子率触,更是在濱河造成了極大的恐慌终议,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葱蝗,死亡現(xiàn)場離奇詭異穴张,居然都是意外死亡,警方通過查閱死者的電腦和手機两曼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門皂甘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悼凑,你說我怎么就攤上這事偿枕。” “怎么了户辫?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵渐夸,是天一觀的道長。 經(jīng)常有香客問我渔欢,道長墓塌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任奥额,我火速辦了婚禮苫幢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垫挨。我一直安慰自己态坦,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布棒拂。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪帚屉。 梳的紋絲不亂的頭發(fā)上谜诫,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音攻旦,去河邊找鬼喻旷。 笑死,一個胖子當著我的面吹牛牢屋,可吹牛的內(nèi)容都是我干的且预。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼烙无,長吁一口氣:“原來是場噩夢啊……” “哼锋谐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起截酷,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤涮拗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后迂苛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體三热,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年三幻,在試婚紗的時候發(fā)現(xiàn)自己被綠了就漾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡念搬,死狀恐怖抑堡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锁蠕,我是刑警寧澤夷野,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站荣倾,受9級特大地震影響悯搔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舌仍,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一妒貌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铸豁,春花似錦灌曙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逆害。三九已至,卻和暖如春蚣驼,著一層夾襖步出監(jiān)牢的瞬間魄幕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工颖杏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纯陨,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓留储,卻偏偏與公主長得像翼抠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子获讳,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355