v-for: v-for 指令需要以 item in items 形式的特殊文法, items 是源資料數組并且 item 是數組元素疊代的别名。
基本用法:
<code><</code><code>div</code> <code>id</code><code>=</code><code>"app"</code><code>></code>
<code> </code><code><</code><code>ul</code><code>></code>
<code> </code><code><</code><code>li</code> <code>v-for</code><code>=</code><code>"item in arr"</code><code>>`item`</</code><code>li</code><code>></code>
<code> </code><code></</code><code>ul</code><code>></code>
<code></</code><code>div</code><code>></code>
<code>new</code> <code>Vue({</code>
<code> </code><code>el:</code><code>'#app'</code><code>,</code>
<code> </code><code>data:{</code>
<code> </code><code>arr:[</code><code>'apple'</code><code>,</code><code>'banana'</code><code>,</code><code>'cherry'</code><code>,</code><code>'durain'</code><code>]</code>
<code> </code><code>}</code>
<code>})</code>
<a href="http://s4.51cto.com/wyfs02/M01/88/F0/wKiom1gA_3XhsxMlAAADmLe6VCw209.png" target="_blank"></a>
這種寫法類似Javascript種的關聯數組,key 和 value,item就相當于數組的value。那數組的下标是否也能打出來呢?
<code> </code><code><</code><code>li</code> <code>v-for</code><code>=</code><code>"item in arr"</code><code>>{{$index}} `item`</</code><code>li</code><code>></code>
<a href="http://s4.51cto.com/wyfs02/M01/88/ED/wKioL1gA_9eD9GHJAAAD-5GfTos987.png" target="_blank"></a>
同理,如果是對于一個對象呢?
<code> </code><code><</code><code>li</code> <code>v-for</code><code>=</code><code>"item in obj"</code><code>>{{$index}} {{$key}} `item`</</code><code>li</code><code>></code>
<code> </code><code>obj:{</code><code>'a'</code><code>:</code><code>'apple'</code><code>,</code><code>'b'</code><code>:</code><code>'banana'</code><code>,</code><code>'c'</code><code>:</code><code>'cherry'</code><code>}</code>
<a href="http://s4.51cto.com/wyfs02/M00/88/ED/wKioL1gBAnLx98X-AAADPjrnLxA588.png" target="_blank"></a>
一樣可以取到對應的下标,key值和value值
那如果在頁面上有一個按鈕,點選一下就添加一個清單項出來怎麼實作呢?
<code> </code><code><</code><code>button</code> <code>@</code><code>click</code><code>=</code><code>"add"</code><code>>添加</</code><code>button</code><code>></code>
<code> </code><code><</code><code>button</code> <code>@</code><code>click</code><code>=</code><code>"delete"</code><code>>删除</</code><code>button</code><code>></code>
<code> </code><code>},</code>
<code> </code><code>methods:{</code>
<code> </code><code>add:</code><code>function</code><code>(){</code>
<code> </code><code>this</code><code>.arr.push(</code><code>'watermelon'</code><code>)</code>
<code> </code><code>},</code>
<code> </code><code>delete</code><code>:</code><code>function</code><code>(){</code>
<code> </code><code>this</code><code>.arr.splice(0,1)</code>
<code> </code><code>}</code>
點選添加按鈕的時候,在數組的末尾添加一個子項;點選删除按鈕的時候,把數組的第一項删掉
我們用 v-for 指令根據一組數組的選項清單進行渲染。 v-for 指令需要以 item in items 形式的特殊文法, items 是源資料數組并且 item 是數組元素疊代的别名。
在 v-for 塊中,我們擁有對父作用域屬性的完全通路權限。 v-for 還支援一個可選的第二個參數為目前項的索引。
<code><</code><code>ul</code> <code>id</code><code>=</code><code>"app"</code><code>></code>
<code> </code><code><</code><code>li</code> <code>v-for</code><code>=</code><code>"(item,index) in items"</code> <code>class</code><code>=</code><code>"item-{{$index}}"</code><code>>{{$index}}-`parentMsg` `item`.`msg`</</code><code>li</code><code>></code>
<code></</code><code>ul</code><code>></code>
<code><</code><code>script</code> <code>src</code><code>=</code><code>"resources/js/vue.js"</code><code>></</code><code>script</code><code>></code>
<code><</code><code>script</code><code>></code>
<code>new Vue({</code>
<code> </code><code>el:'#app',</code>
<code> </code><code>parentMsg:'滴滴',</code>
<code> </code><code>items:[</code>
<code> </code><code>{msg:'順風車'},</code>
<code> </code><code>{msg:'專車'},</code>
<code> </code><code>{msg:'特斯拉'}</code>
<code> </code><code>]</code>
<code></</code><code>script</code><code>></code>
<a href="http://s1.51cto.com/wyfs02/M00/8A/4E/wKiom1gtE1Kg7Dt_AABjtDdOq8w739.png" target="_blank"></a>
Vue.js 1.0.17及以後版本支援of分隔符,更接近 JavaScript 周遊器的文法:
<code><</code><code>div</code> <code>v-for</code><code>=</code><code>"item of items"</code><code>></</code><code>div</code><code>></code>
Template v-for
如同 v-if 模闆,你也可以用帶有 v-for 的 <template> 标簽來渲染多個元素塊
<code> </code><code><</code><code>template</code> <code>v-for</code><code>=</code><code>"item in items"</code><code>></code>
<code> </code><code><</code><code>li</code><code>>`item`.`msg`</</code><code>li</code><code>></code>
<code> </code><code></</code><code>template</code><code>></code>
<code> </code><code>new Vue({</code>
<code> </code><code>el:'#app',</code>
<code> </code><code>data:{</code>
<code> </code><code>parentMsg:'滴滴',</code>
<code> </code><code>items:[</code>
<code> </code><code>{msg:'順風車'},</code>
<code> </code><code>{msg:'專車'},</code>
<code> </code><code>{msg:'特斯拉'}</code>
<code> </code><code>]</code>
<code> </code><code>})</code>
<a href="http://s1.51cto.com/wyfs02/M01/8A/4E/wKiom1gtFj-jpit7AABRHMMPREs268.png" target="_blank"></a>
對象疊代 v-for
也可以用 v-for 通過一個對象的屬性來疊代
<code> </code><code><</code><code>li</code> <code>v-for</code><code>=</code><code>"value in object"</code><code>>`value`</</code><code>li</code><code>></code>
<code> </code><code>object:{</code>
<code> </code><code>uname:'Roger Wu',</code>
<code> </code><code>uage:26,</code>
<code> </code><code>country:'China'</code>
<a href="http://s2.51cto.com/wyfs02/M01/8A/4B/wKioL1gtF9qR3nv_AABU_H-PrD4475.png" target="_blank"></a>
也可以提供第二個參數,鍵值:
<code><ul id=</code><code>"app"</code><code>></code>
<code> </code><code><li v-</code><code>for</code><code>=</code><code>"(key,value) in object"</code><code>>`key`: `value`</li></code>
<code></ul></code>
<code><script src=</code><code>"resources/js/vue.js"</code><code>></script></code>
<code><script></code>
<code> </code><code>uname:</code><code>'Roger Wu'</code><code>,</code>
<code> </code><code>country:</code><code>'China'</code>
<code></script></code>
<a href="http://s1.51cto.com/wyfs02/M02/8A/4B/wKioL1gtGK7gFeLmAABFkHceDmQ194.png" target="_blank"></a>
也可以提供第三個參數,索引值:
<code> </code><code><</code><code>li</code> <code>v-for</code><code>=</code><code>"(index,key,value) in object"</code><code>>{{$index}}-`key`: `value`</</code><code>li</code><code>></code>
在周遊對象時,是按 Object.keys() 的結果周遊,但是不能保證它的結果在不同的 JavaScript 引擎下是一緻的。
整數疊代 v-for
v-for 也可以取整數。在這種情況下,它将重複多次模闆。
<code><</code><code>div</code> <code>id</code><code>=</code><code>"demo"</code><code>></code>
<code> </code><code><</code><code>span</code> <code>v-for</code><code>=</code><code>"n in 10"</code><code>>`n`</</code><code>span</code><code>></code>
<code>var vm2 = new Vue({</code>
<code> </code><code>el:'#demo'</code>
<a href="http://s2.51cto.com/wyfs02/M01/8A/50/wKiom1gtHBiwcexbAAAB5g9dyB0611.png" target="_blank"></a>
Vue1.0版本
重複資料的渲染 track-by
前面所有的例子中,同一個數組中都沒有重複内容,那如果數組中出現重複内容的話,是否還能正常渲染呢?
代碼示例如下:
<code> </code><code><</code><code>li</code> <code>v-for</code><code>=</code><code>"item in items"</code><code>>`item`</</code><code>li</code><code>></code>
<code><</code><code>script</code> <code>src</code><code>=</code><code>"//cdn.bootcss.com/vue/1.0.26/vue.js"</code><code>></</code><code>script</code><code>></code>
<code> </code><code>var vm =new Vue({</code>
<code> </code><code>items:['Tom','Marry','Jim']</code>
<code> </code><code>methods:{</code>
<code> </code><code>add:function(){</code>
<code> </code><code>return this.items.push('Roger')</code>
<code> </code><code>}</code>
點選按鈕時,往數組中添加一個新的元素,這個一點問題也沒有。問題是,頁面渲染出新的元素‘Roger’以後,你再點這個按鈕,控制台報錯了。
<a href="http://s3.51cto.com/wyfs02/M00/8A/A6/wKiom1g2ZgPgsTNKAABKAR7Ad8M714.png" target="_blank"></a>
數組中發現了重複元素,如果想要添加重複元素的話,可以使用 track-by="$index/uid" (可以是索引,也可以是資料庫中的id 值)
修改示例代碼如下:
<code> </code><code><</code><code>li</code> <code>v-for</code><code>=</code><code>"item in items"</code> <code>track-by</code><code>=</code><code>"$index"</code><code>>`item`</</code><code>li</code><code>></code>
再來看效果,完美解決
<a href="http://s2.51cto.com/wyfs02/M00/8A/A2/wKioL1g2ZwiDkVNVAAA4ZmylbnQ659.png" target="_blank"></a>
Vue 2.0版本
相比Vue 1.0 版本,Vue2.0 在清單渲染方面主要有以下幾個改變:
1、允許數組重複元素
還是上面的例子,我們引入一個Vue2.0 的js檔案
<code><</code><code>script</code> <code>src</code><code>=</code><code>"//cdn.bootcss.com/vue/2.0.8/vue.js"</code><code>></</code><code>script</code><code>></code>
沒有 track-by,把vue檔案換成了2.0版本,效果可見下圖,随意添加重複元素
<a href="http://s4.51cto.com/wyfs02/M00/8A/B0/wKiom1g3mYaRarO2AABb6mNurXY476.png" target="_blank"></a>
2、去掉了一些隐式變量 $index, $key
如果想要擷取數組或對象元素的下标可以用 v-for="(val,index) in array"
先看Vue1.0版本的代碼示例:
<code> </code><code><</code><code>li</code> <code>v-for</code><code>=</code><code>"item in items"</code><code>>{{$index}}-`item`</</code><code>li</code><code>></code>
<code><!--Vue1.0--></code>
<code><</code><code>script</code> <code>src</code><code>=</code><code>"//cdn.bootcss.com/vue/1.0.18/vue.js"</code><code>></</code><code>script</code><code>></code>
<code> </code><code>var vm = new Vue({</code>
<code> </code><code>items:['Apple','Hua Wei','Oppo','Vivo']</code>
使用 $index 來擷取數組下标,一點問題也沒有:
<a href="http://s5.51cto.com/wyfs02/M01/8A/B0/wKiom1g3m0PjBljLAABfqpw87pQ019.png" target="_blank"></a>
再看Vue2.0版本的代碼示例:
<code><!--Vue2.0--></code>
報錯了,說 $index在 執行個體中沒有定義
<a href="http://s4.51cto.com/wyfs02/M02/8A/B0/wKiom1g3m4-AR1o9AABAkWpRVP0503.png" target="_blank"></a>
我們剛才已經指出了 1.0版本 和 2.0版本的差別,現在不妨試一試
<code> </code><code><</code><code>li</code> <code>v-for</code><code>=</code><code>"(item,index) in items"</code><code>>`index`-`item`</</code><code>li</code><code>></code>
檢視效果,完美解決
<a href="http://s5.51cto.com/wyfs02/M00/8A/AC/wKioL1g3nDLBM7eJAABXWU_WOxI527.png" target="_blank"></a>
再來看一個關于 $key的例子
<code> </code><code><</code><code>li</code> <code>v-for</code><code>=</code><code>"value in items"</code><code>>{{$key}} - `value`</</code><code>li</code><code>></code>
<code> </code><code>items:{</code>
<code> </code><code>name:'Roger',</code>
<code> </code><code>age:26,</code>
<code> </code><code>gender:'male'</code>
<a href="http://s1.51cto.com/wyfs02/M01/8A/AC/wKioL1g3oP_DCSdYAABR3i52pb0458.png" target="_blank"></a>
Vue2.0版本
使用 $key:
報錯了,$key 未定義
使用 v-for="(item,key) in items":
<code> </code><code><</code><code>li</code> <code>v-for</code><code>=</code><code>"(value,key) in items"</code><code>>`key` - `value`</</code><code>li</code><code>></code>
頁面渲染截圖:
<a href="http://s2.51cto.com/wyfs02/M00/8A/B1/wKiom1g3oeihVoLrAABNGpOBxUg554.png" target="_blank"></a>
3、track-by="$index/uid" 變成 <li v-for="(val,index) in list" :key="index">
在Vue1.0 中,track-by 除了可以讓數組添加重複元素以外,還有很大一個作用就是提升循環的性能
在Vue2.0中,數組重複元素已經不是問題了,性能提升這塊還是有必要的
<code> </code><code><</code><code>li</code> <code>v-for</code><code>=</code><code>"(item,index) in items"</code> <code>:key</code><code>=</code><code>"index"</code><code>>`index`-`item`</</code><code>li</code><code>></code>
<code>本文轉自 frwupeng517 51CTO部落格,原文連結:http://blog.51cto.com/dapengtalk/1862092</code>