Vue學習之路第十四篇:v-for指令中key的使用注意事項


1、學前准備:

JavaScript中有一個方法:unshift() ,其作用是向數組的開頭添加一個或更多元素,並返回新的長度。該方法的第一個參數將成為數組的新元素 0,如果還有第二個參數,它將成為新的元素 1,以此類推。

2、直接上代碼

<body>
    <divi id="app">
        序號:<input type="text" v-model="idValue"/>&emsp;
        車名:<input type="text" v-model="nameValue"/>&emsp;
        <button v-on:click="add()">添加</button>
        <p v-for="item in list">
            <input type="checkbox" name="car"></checkbox>序號:{{item.id }} , 車名:{{ item.name }}<br/> 
        </p>
    </div>

    <script type="text/javascript">
        var vm = new Vue({
            el:"#app",
            data:{
                idValue:'',
                nameValue:'',
                list:[
                    {id:1,name:'奧迪'},
                    {id:2,name:'寶馬'},
                    {id:3,name:'奔馳'},
                    {id:4,name:'勞斯萊斯'},
                    {id:5,name:'瑪莎拉蒂'}
                ]
            },
            methods:{
                add(){
                    this.list.unshift({
                        id : this.idValue,
                        name : this.nameValue
                    });
                }
            }
        })
    </script>
</body>

這里我們定義了一個list集合,並通過在input中輸入內容,然后把新的車型添加到list集合中並顯示在頁面上。運行結果如下:

我們在第一個input框中填入數字6,第二個input框中添加保時捷車型,點擊添加按鈕,運行結果如下;

看頁面信息好像我們已經添加成功了,沒有什么問題。現在我們把序號為5的瑪莎拉蒂復選框勾上,然后再點擊添加按鈕,看看有什么現象。

What?明明勾的是瑪莎拉蒂怎么變成勞斯萊斯了!原因就在於v-for指令只能簡單的實現數據的遍歷,當你的數據發生變化的時候,由於數據和指令的唯一關聯就是遍歷時的數組下標,所以當你勾選瑪莎拉蒂的時候,指令記住了你勾選的數組下標為5(數組下標是從0開始的),當你往數組里添新元素之后,雖然數組長度變了,但是指令只記得你當時勾選的數組下標,於是就幫你把新數組中下標為5的勞斯萊斯給勾選了。為了解決這種問題,在使用v-for指令的時候我們需要加入一個新屬性:key,寫法為key="XX",其中XX必須具有唯一性,即可以通過key來識別出對應的遍歷元素。

<p v-for="item in list" v-bind:key="item.id">
      <input type="checkbox" name="car"></checkbox>
      序號: {{item.id }} , 車名:{{ item.name }}<br/> 
</p>

這里在v-for指令里加入了key屬性,通過屬性綁定指令v-bind綁定了元素的序號,即通過序號來識別每個數組元素(當然這個時候你要保證序號不能重復,要具備唯一性,不然勾選序號重復的元素的時候還是會出現上面的問題)。這個時候再把序號為5的瑪莎拉蒂復選框勾上,然后再點擊添加按鈕,看看有什么現象。

保時捷被成功添加了,而且瑪莎拉蒂的復選框還是被選中狀態。

總結:如果你只是簡單的遍歷,那么v-for指令完全可以滿足,如果還涉及到數組數據的改變或者操作,那么就需要加上屬性key來幫助指令來識別每個遍歷元素。

 

每天進步一點點!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM