key和數(shù)組方法

key

vue官網(wǎng)推薦我們使用v-for時劝篷,給每一個節(jié)點元素添加一個唯一的 key,其實不只是vue民宿,react中在執(zhí)行列表渲染時也會要求給每個組件添加上key這個屬性娇妓。

要了解key的作用,首先我們要簡單了解一下虛擬DOM的Diff算法

vue和react都實現(xiàn)了一套虛擬DOM活鹰,使我們可以不直接操作DOM元素哈恰,只操作數(shù)據(jù)便可以重新渲染頁面。而隱藏在背后的原理便是其高效的Diff算法志群。

 vue和react的虛擬DOM的Diff算法大致相同着绷,其核心是基于兩個簡單的假設:

1. 兩個相同的組件產(chǎn)生類似的DOM結構,不同的組件產(chǎn)生不同的DOM結構锌云。

2. 同一層級的一組節(jié)點蓬戚,他們可以通過唯一的id進行區(qū)分。

基于以上這兩點假設宾抓,使得虛擬DOM的Diff算法的復雜度從O(n^3)降到了O(n)子漩。

好吧,這樣解釋石洗,似乎有點籠統(tǒng)了幢泼,我們來看一個例子:

我們希望可以在B和C之間加一個F,

key1.png

Diff算法默認執(zhí)行起來是這樣的:

key2.png

就是C更新成F讲衫,D更新成C缕棵,E更新成D,最后再插入E

所以我們需要使用key來給每個節(jié)點做一個唯一標識涉兽,Diff算法就可以正確的識別此節(jié)點招驴,找到正確的位置區(qū)插入新的節(jié)點。

key3.png

所以一句話枷畏,key的作用主要是為了高效的更新虛擬DOM

寫一個案例:

 <div id="app">
     <ul>
         沒有加key
         <li v-for="item in arr">
             <input type="checkbox"/>{{item}}
         </li>
         <button @click="add">添加</button>
     </ul>

     <ul>
         沒有加key
         <li v-for="item in arr" :key="item">
             <input type="checkbox"/>{{item}}
         </li>
         <button @click="add">添加</button>
     </ul>
</div>
<script>
    new Vue({
        data(){
            return{
                arr:["a","b","c","d","e"]
            }
        },
        methods:{
            add(){
                this.arr.splice(2,0,'f')
            }
        }
    }).$mount("#app")
</script>

先選中C别厘,當沒有加key的插入F的時候,選中的狀態(tài)變化

key4.gif

可以看的出來拥诡,算法是直接將C變成了F

那么我們再來看下触趴,加了key的效果:


key5.gif

加了,算法可以準確無誤的在b和c之間添加了一個f

數(shù)組方法

當數(shù)據(jù)發(fā)生變化時渴肉,Vue會自動檢測數(shù)據(jù)的變化冗懦,視圖會發(fā)生對應的更新。

Vue中包含了一組觀察數(shù)組編譯的方法仇祭,使用它們改變數(shù)組也會觸發(fā)視圖的更新

變異方法:會改變原始數(shù)組

數(shù)組方法1.png

非變異方法:不會改變原始數(shù)組披蕉,但是會返回一個新數(shù)組

  • fliter()
  • slice()
  • concat()
<div id="app">
    <ul>
        <li v-for="item in arr" :key="item">{{item}}</li>
        <button @click="add()">添加</button>
    </ul>
</div>
<script>
    new Vue({
        data(){
            return{
                arr:["王者榮耀","絕地求生","c","d","e"]
            }
        },
        methods:{
            add(){
                // push
                // this.arr.push("全軍出擊", "aa0", "bb");

                // pop
                // this.arr.pop()

                // shift 刪除數(shù)組中的第一個元素
                // this.arr.shift()

                // 
                // this.arr.unshift("123")

                // this.arr.splice(1,2)
                // this.arr.splice(1,0, "456","567")

                // this.arr.splice(1,2, "456","567")

                // 這樣修改數(shù)組中的元素,視圖是不會更新的
                // this.arr[1] = "999"

                // 使用vue的set方法更新
                // 全局set
                // Vue.set(this.arr, 1, "999")
                // 當前實例set

                this.$set(this.arr, 1, "888")

            }
        }
    }).$mount("#app")
</script>

直接修改數(shù)組中的元素,視圖是不會更新的没讲,需要用到Vue中的set方法

// 這樣修改數(shù)組中的元素承冰,視圖是不會更新的
// this.arr[1] = "999"

// 使用vue的set方法更新
// 全局set
// Vue.set(this.arr, 1, "999")

// 當前實例set
this.$set(this.arr, 1, "888")
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市食零,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寂屏,老刑警劉巖贰谣,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異迁霎,居然都是意外死亡吱抚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門考廉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秘豹,“玉大人,你說我怎么就攤上這事昌粤〖热疲” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵涮坐,是天一觀的道長凄贩。 經(jīng)常有香客問我,道長袱讹,這世上最難降的妖魔是什么疲扎? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮捷雕,結果婚禮上椒丧,老公的妹妹穿的比我還像新娘。我一直安慰自己救巷,他們只是感情好壶熏,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浦译,像睡著了一般久橙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上管怠,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天淆衷,我揣著相機與錄音,去河邊找鬼渤弛。 笑死祝拯,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播佳头,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼鹰贵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了康嘉?” 一聲冷哼從身側響起碉输,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亭珍,沒想到半個月后敷钾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡肄梨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年阻荒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片众羡。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡侨赡,死狀恐怖,靈堂內的尸體忽然破棺而出粱侣,到底是詐尸還是另有隱情羊壹,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布齐婴,位于F島的核電站舶掖,受9級特大地震影響,放射性物質發(fā)生泄漏尔店。R本人自食惡果不足惜眨攘,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嚣州。 院中可真熱鬧鲫售,春花似錦、人聲如沸该肴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匀哄。三九已至秦效,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涎嚼,已是汗流浹背阱州。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留法梯,地道東北人苔货。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓犀概,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夜惭。 傳聞我的和親對象是個殘疾皇子姻灶,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容