天天看點

清單渲染 Vue2.0與Vue1.0的差別

v-for:  v-for 指令需要以 item in items 形式的特殊文法, items 是源資料數組并且 item 是數組元素疊代的别名。

基本用法:

<code>&lt;</code><code>div</code> <code>id</code><code>=</code><code>"app"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>ul</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>li</code> <code>v-for</code><code>=</code><code>"item in arr"</code><code>&gt;`item`&lt;/</code><code>li</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>ul</code><code>&gt;</code>

<code>&lt;/</code><code>div</code><code>&gt;</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>&lt;</code><code>li</code> <code>v-for</code><code>=</code><code>"item in arr"</code><code>&gt;{{$index}} `item`&lt;/</code><code>li</code><code>&gt;</code>

<a href="http://s4.51cto.com/wyfs02/M01/88/ED/wKioL1gA_9eD9GHJAAAD-5GfTos987.png" target="_blank"></a>

同理,如果是對于一個對象呢?

<code>        </code><code>&lt;</code><code>li</code> <code>v-for</code><code>=</code><code>"item in obj"</code><code>&gt;{{$index}} {{$key}} `item`&lt;/</code><code>li</code><code>&gt;</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>&lt;</code><code>button</code> <code>@</code><code>click</code><code>=</code><code>"add"</code><code>&gt;添加&lt;/</code><code>button</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>button</code> <code>@</code><code>click</code><code>=</code><code>"delete"</code><code>&gt;删除&lt;/</code><code>button</code><code>&gt;</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>&lt;</code><code>ul</code> <code>id</code><code>=</code><code>"app"</code><code>&gt;</code>

<code>    </code><code>&lt;</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>&gt;{{$index}}-`parentMsg` `item`.`msg`&lt;/</code><code>li</code><code>&gt;</code>

<code>&lt;/</code><code>ul</code><code>&gt;</code>

<code>&lt;</code><code>script</code> <code>src</code><code>=</code><code>"resources/js/vue.js"</code><code>&gt;&lt;/</code><code>script</code><code>&gt;</code>

<code>&lt;</code><code>script</code><code>&gt;</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>&lt;/</code><code>script</code><code>&gt;</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>&lt;</code><code>div</code> <code>v-for</code><code>=</code><code>"item of items"</code><code>&gt;&lt;/</code><code>div</code><code>&gt;</code>

Template v-for

如同 v-if 模闆,你也可以用帶有 v-for 的 &lt;template&gt; 标簽來渲染多個元素塊

<code>    </code><code>&lt;</code><code>template</code> <code>v-for</code><code>=</code><code>"item in items"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>li</code><code>&gt;`item`.`msg`&lt;/</code><code>li</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>template</code><code>&gt;</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>&lt;</code><code>li</code> <code>v-for</code><code>=</code><code>"value in object"</code><code>&gt;`value`&lt;/</code><code>li</code><code>&gt;</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>&lt;ul id=</code><code>"app"</code><code>&gt;</code>

<code>    </code><code>&lt;li v-</code><code>for</code><code>=</code><code>"(key,value) in object"</code><code>&gt;`key`: `value`&lt;/li&gt;</code>

<code>&lt;/ul&gt;</code>

<code>&lt;script src=</code><code>"resources/js/vue.js"</code><code>&gt;&lt;/script&gt;</code>

<code>&lt;script&gt;</code>

<code>            </code><code>uname:</code><code>'Roger Wu'</code><code>,</code>

<code>            </code><code>country:</code><code>'China'</code>

<code>&lt;/script&gt;</code>

<a href="http://s1.51cto.com/wyfs02/M02/8A/4B/wKioL1gtGK7gFeLmAABFkHceDmQ194.png" target="_blank"></a>

也可以提供第三個參數,索引值:

<code>    </code><code>&lt;</code><code>li</code> <code>v-for</code><code>=</code><code>"(index,key,value) in object"</code><code>&gt;{{$index}}-`key`: `value`&lt;/</code><code>li</code><code>&gt;</code>

在周遊對象時,是按 Object.keys() 的結果周遊,但是不能保證它的結果在不同的 JavaScript 引擎下是一緻的。

整數疊代 v-for

v-for 也可以取整數。在這種情況下,它将重複多次模闆。

<code>&lt;</code><code>div</code> <code>id</code><code>=</code><code>"demo"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>span</code> <code>v-for</code><code>=</code><code>"n in 10"</code><code>&gt;`n`&lt;/</code><code>span</code><code>&gt;</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>&lt;</code><code>li</code> <code>v-for</code><code>=</code><code>"item in items"</code><code>&gt;`item`&lt;/</code><code>li</code><code>&gt;</code>

<code>&lt;</code><code>script</code> <code>src</code><code>=</code><code>"//cdn.bootcss.com/vue/1.0.26/vue.js"</code><code>&gt;&lt;/</code><code>script</code><code>&gt;</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>&lt;</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>&gt;`item`&lt;/</code><code>li</code><code>&gt;</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>&lt;</code><code>script</code> <code>src</code><code>=</code><code>"//cdn.bootcss.com/vue/2.0.8/vue.js"</code><code>&gt;&lt;/</code><code>script</code><code>&gt;</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>&lt;</code><code>li</code> <code>v-for</code><code>=</code><code>"item in items"</code><code>&gt;{{$index}}-`item`&lt;/</code><code>li</code><code>&gt;</code>

<code>&lt;!--Vue1.0--&gt;</code>

<code>&lt;</code><code>script</code> <code>src</code><code>=</code><code>"//cdn.bootcss.com/vue/1.0.18/vue.js"</code><code>&gt;&lt;/</code><code>script</code><code>&gt;</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>&lt;!--Vue2.0--&gt;</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>&lt;</code><code>li</code> <code>v-for</code><code>=</code><code>"(item,index) in items"</code><code>&gt;`index`-`item`&lt;/</code><code>li</code><code>&gt;</code>

檢視效果,完美解決

<a href="http://s5.51cto.com/wyfs02/M00/8A/AC/wKioL1g3nDLBM7eJAABXWU_WOxI527.png" target="_blank"></a>

再來看一個關于 $key的例子

<code>        </code><code>&lt;</code><code>li</code> <code>v-for</code><code>=</code><code>"value in items"</code><code>&gt;{{$key}} - `value`&lt;/</code><code>li</code><code>&gt;</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>&lt;</code><code>li</code> <code>v-for</code><code>=</code><code>"(value,key) in items"</code><code>&gt;`key` - `value`&lt;/</code><code>li</code><code>&gt;</code>

頁面渲染截圖:

<a href="http://s2.51cto.com/wyfs02/M00/8A/B1/wKiom1g3oeihVoLrAABNGpOBxUg554.png" target="_blank"></a>

3、track-by="$index/uid" 變成 &lt;li v-for="(val,index) in list" :key="index"&gt;

在Vue1.0 中,track-by 除了可以讓數組添加重複元素以外,還有很大一個作用就是提升循環的性能

在Vue2.0中,數組重複元素已經不是問題了,性能提升這塊還是有必要的

<code>        </code><code>&lt;</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>&gt;`index`-`item`&lt;/</code><code>li</code><code>&gt;</code>

<code>本文轉自   frwupeng517   51CTO部落格,原文連結:http://blog.51cto.com/dapengtalk/1862092</code>

繼續閱讀