您好,登錄后才能下訂單哦!
v-for: v-for 指令需要以 item in items 形式的特殊語法, items 是源數據數組并且 item 是數組元素迭代的別名。
基本用法:
<div id="app"> <ul> <li v-for="item in arr">`item`</li> </ul> </div>
new Vue({ el:'#app', data:{ arr:['apple','banana','cherry','durain'] } })
這種寫法類似Javascript種的關聯數組,key 和 value,item就相當于數組的value。那數組的下標是否也能打出來呢?
<div id="app"> <ul> <li v-for="item in arr">{{$index}} `item`</li> </ul> </div>
同理,如果是對于一個對象呢?
<div id="app"> <ul> <li v-for="item in obj">{{$index}} {{$key}} `item`</li> </ul> </div>
new Vue({ el:'#app', data:{ obj:{'a':'apple','b':'banana','c':'cherry'} } })
一樣可以取到對應的下標,key值和value值
那如果在頁面上有一個按鈕,點擊一下就添加一個列表項出來怎么實現呢?
<div id="app"> <button @click="add">添加</button> <button @click="delete">刪除</button> <ul> <li v-for="item in arr">{{$index}} `item`</li> </ul> </div>
new Vue({ el:'#app', data:{ arr:['apple','banana','cherry','durain'] }, methods:{ add:function(){ this.arr.push('watermelon') }, delete:function(){ this.arr.splice(0,1) } } })
點擊添加按鈕的時候,在數組的末尾添加一個子項;點擊刪除按鈕的時候,把數組的第一項刪掉
我們用 v-for 指令根據一組數組的選項列表進行渲染。 v-for 指令需要以 item in items 形式的特殊語法, items 是源數據數組并且 item 是數組元素迭代的別名。
在 v-for 塊中,我們擁有對父作用域屬性的完全訪問權限。 v-for 還支持一個可選的第二個參數為當前項的索引。
<ul id="app"> <li v-for="(item,index) in items" class="item-{{$index}}">{{$index}}-`parentMsg` `item`.`msg`</li> </ul> <script src="resources/js/vue.js"></script> <script> new Vue({ el:'#app', data:{ parentMsg:'滴滴', items:[ {msg:'順風車'}, {msg:'專車'}, {msg:'特斯拉'} ] } }) </script>
Vue.js 1.0.17及以后版本支持of分隔符,更接近 JavaScript 遍歷器的語法:
<div v-for="item of items"></div>
Template v-for
如同 v-if 模板,你也可以用帶有 v-for 的 <template> 標簽來渲染多個元素塊
<ul id="app"> <template v-for="item in items"> <li>`item`.`msg`</li> </template> </ul> <script src="resources/js/vue.js"></script> <script> new Vue({ el:'#app', data:{ parentMsg:'滴滴', items:[ {msg:'順風車'}, {msg:'專車'}, {msg:'特斯拉'} ] } }) </script>
對象迭代 v-for
也可以用 v-for 通過一個對象的屬性來迭代
<ul id="app"> <li v-for="value in object">`value`</li> </ul> <script src="resources/js/vue.js"></script> <script> new Vue({ el:'#app', data:{ object:{ uname:'Roger Wu', uage:26, country:'China' } } }) </script>
也可以提供第二個參數,鍵值:
<ul id="app"> <li v-for="(key,value) in object">`key`: `value`</li> </ul> <script src="resources/js/vue.js"></script> <script> new Vue({ el:'#app', data:{ object:{ uname:'Roger Wu', uage:26, country:'China' } } }) </script>
也可以提供第三個參數,索引值:
<ul id="app"> <li v-for="(index,key,value) in object">{{$index}}-`key`: `value`</li> </ul>
在遍歷對象時,是按 Object.keys() 的結果遍歷,但是不能保證它的結果在不同的 JavaScript 引擎下是一致的。
整數迭代 v-for
v-for 也可以取整數。在這種情況下,它將重復多次模板。
<div id="demo"> <span v-for="n in 10">`n`</span> </div> <script src="resources/js/vue.js"></script> <script> var vm2 = new Vue({ el:'#demo' }) </script>
Vue1.0版本
重復數據的渲染 track-by
前面所有的例子中,同一個數組中都沒有重復內容,那如果數組中出現重復內容的話,是否還能正常渲染呢?
代碼示例如下:
<div id="app"> <button @click="add">添加</button> <ul> <li v-for="item in items">`item`</li> </ul> </div> <script src="http://cdn.bootcss.com/vue/1.0.26/vue.js"></script> <script> var vm =new Vue({ el:'#app', data:{ items:['Tom','Marry','Jim'] }, methods:{ add:function(){ return this.items.push('Roger') } } }) </script>
點擊按鈕時,往數組中添加一個新的元素,這個一點問題也沒有。問題是,頁面渲染出新的元素‘Roger’以后,你再點這個按鈕,控制臺報錯了。
數組中發現了重復元素,如果想要添加重復元素的話,可以使用 track-by="$index/uid" (可以是索引,也可以是數據庫中的id 值)
修改示例代碼如下:
<div id="app"> <button @click="add">添加</button> <ul> <li v-for="item in items" track-by="$index">`item`</li> </ul> </div> <script src="http://cdn.bootcss.com/vue/1.0.26/vue.js"></script> <script> var vm =new Vue({ el:'#app', data:{ items:['Tom','Marry','Jim'] }, methods:{ add:function(){ return this.items.push('Roger') } } }) </script>
再來看效果,完美解決
Vue 2.0版本
相比Vue 1.0 版本,Vue2.0 在列表渲染方面主要有以下幾個改變:
1、允許數組重復元素
還是上面的例子,我們引入一個Vue2.0 的js文件
<div id="app"> <button @click="add">添加</button> <ul> <li v-for="item in items">`item`</li> </ul> </div> <script src="http://cdn.bootcss.com/vue/2.0.8/vue.js"></script> <script> var vm =new Vue({ el:'#app', data:{ items:['Tom','Marry','Jim'] }, methods:{ add:function(){ return this.items.push('Roger') } } }) </script>
沒有 track-by,把vue文件換成了2.0版本,效果可見下圖,隨意添加重復元素
2、去掉了一些隱式變量 $index, $key
如果想要獲取數組或對象元素的下標可以用 v-for="(val,index) in array"
先看Vue1.0版本的代碼示例:
<div id="app"> <ul> <li v-for="item in items">{{$index}}-`item`</li> </ul> </div> <!--Vue1.0--> <script src="http://cdn.bootcss.com/vue/1.0.18/vue.js"></script> <script> var vm = new Vue({ el:'#app', data:{ items:['Apple','Hua Wei','Oppo','Vivo'] } }) </script>
使用 $index 來獲取數組下標,一點問題也沒有:
再看Vue2.0版本的代碼示例:
<div id="app"> <ul> <li v-for="item in items">{{$index}}-`item`</li> </ul> </div> <!--Vue2.0--> <script src="http://cdn.bootcss.com/vue/2.0.8/vue.js"></script> <script> var vm = new Vue({ el:'#app', data:{ items:['Apple','Hua Wei','Oppo','Vivo'] } }) </script>
報錯了,說 $index在 實例中沒有定義
我們剛才已經指出了 1.0版本 和 2.0版本的區別,現在不妨試一試
<div id="app"> <ul> <li v-for="(item,index) in items">`index`-`item`</li> </ul> </div> <!--Vue2.0--> <script src="http://cdn.bootcss.com/vue/2.0.8/vue.js"></script> <script> var vm = new Vue({ el:'#app', data:{ items:['Apple','Hua Wei','Oppo','Vivo'] } }) </script>
查看效果,完美解決
再來看一個關于 $key的例子
Vue1.0版本
<div id="app"> <ul> <li v-for="value in items">{{$key}} - `value`</li> </ul> </div> <script src="http://cdn.bootcss.com/vue/1.0.26/vue.js"></script> <script> var vm = new Vue({ el:'#app', data:{ items:{ name:'Roger', age:26, gender:'male' } } }) </script>
Vue2.0版本
使用 $key:
<div id="app"> <ul> <li v-for="value in items">{{$key}} - `value`</li> </ul> </div> <script src="http://cdn.bootcss.com/vue/2.0.8/vue.js"></script> <script> var vm = new Vue({ el:'#app', data:{ items:{ name:'Roger', age:26, gender:'male' } } }) </script>
報錯了,$key 未定義
使用 v-for="(item,key) in items":
<div id="app"> <ul> <li v-for="(value,key) in items">`key` - `value`</li> </ul> </div> <script src="http://cdn.bootcss.com/vue/2.0.8/vue.js"></script> <script> var vm = new Vue({ el:'#app', data:{ items:{ name:'Roger', age:26, gender:'male' } } }) </script>
頁面渲染截圖:
3、track-by="$index/uid" 變成 <li v-for="(val,index) in list" :key="index">
在Vue1.0 中,track-by 除了可以讓數組添加重復元素以外,還有很大一個作用就是提升循環的性能
在Vue2.0中,數組重復元素已經不是問題了,性能提升這塊還是有必要的
<div id="app"> <ul> <li v-for="(item,index) in items" :key="index">`index`-`item`</li> </ul> </div> <!--Vue2.0--> <script src="http://cdn.bootcss.com/vue/2.0.8/vue.js"></script> <script> var vm = new Vue({ el:'#app', data:{ items:['Apple','Hua Wei','Oppo','Vivo'] } }) </script>
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。