v-for="item in items " // 數組更新檢測 // 對象更改檢測注意事項 // 顯示過濾 / 排序結果 // 一段取值範圍的 v-for // vue
<ul id="example-1"> <li v-for="item in items"> {{ item.message }} </li> </ul> var example1 = new Vue({ el: '#example-1', data: { items: [ { message: 'Foo' }, { message: 'Bar' } ] } }) ==> · Foo · Bar
在 v-for 塊中,咱們擁有對父做用域屬性的徹底訪問權限。v-for 還支持一個可選的第二個參數爲當前項的索引api
<ul id="example-2"> <li v-for="(item, index) in items"> {{ parentMessage }} - {{ index }} - {{ item.message }} </li> </ul> var example2 = new Vue({ el: '#example-2', data: { parentMessage: 'Parent', items: [ { message: 'Foo' }, { message: 'Bar' } ] } }) 你也能夠用 of 替代 in 做爲分隔符,由於它是最接近 JavaScript 迭代器的語法: <div v-for="item of items"></div>
<ul> <li v-for="value in object"> {{ value }} </li> </ul> var app = new Vue({ el:"#app", data:{ object:{ tit:"標題", con:"內容", time:"中午" } } }) ==> ·標題 ·內容
能夠提供第二個的參數爲鍵名數組
<ul> <li v-for="(value,key) in object"> {{ key }} : {{ value }} </li> </ul> ==> ·tit : 標題 ·con : 內容 ·time : 中午
第三個參數爲索引app
<ul> <li v-for="(value,key) in object"> {{ index }}. : {{ key }} : {{ value }} </li> </ul> ==> ·0. tit : 標題 ·1. con : 內容 ·2. time : 中午
在遍歷對象時,是按 Object.keys() 的結果遍歷,可是不能保證它的結果在不一樣的 JavaScript 引擎下是一致的ide
<div v-for="item in items" :key="item.id"> <!-- 內容 --> </div>
* push() * pop() * shift() * unshift() * splice() * sort() * reverse()
example1.items = example1.items.filter(function (item) { return item.message.match(/Foo/) })
你可能認爲這將致使 Vue 丟棄現有 DOM 並從新渲染整個列表。幸運的是,事實並不是如此。Vue 爲了使得 DOM 元素獲得最大範圍的重用而實現了一些智能的、啓發式的方法,因此用一個含有相同元素的數組去替換原來的數組是很是高效的操做。性能
var vm = new Vue({ data: { items: ['a', 'b', 'c'] } }) vm.items[1] = 'x' // 不是響應性的 vm.items.length = 2 // 不是響應性的
爲了解決第一類問題,如下兩種方式均可以實現和 vm.items[indexOfItem] = newValue 相同的效果,同時也將觸發狀態更新:this
// Vue.set Vue.set(vm.items, indexOfItem, newValue) // Array.prototype.splice vm.items.splice(indexOfItem, 1, newValue)
你也可使用 vm.$set 實例方法,該方法是全局方法 Vue.set 的一個別名spa
vm.$set(vm.items, indexOfItem, newValue)
爲了解決第二類問題,你可使用 splice:prototype
vm.items.splice(newLength)
var vm = new Vue({ data: { a: 1 } }) // `vm.a` 如今是響應式的 vm.b = 2 // `vm.b` 不是響應式的
var vm = new Vue({ data: { userProfile: { name: 'Anika' } } })
你能夠添加一個新的 age 屬性到嵌套的 userProfile 對象:code
Vue.set(vm.userProfile, 'age', 27)
你還可使用 vm.$set 實例方法,它只是全局 Vue.set 的別名:
vm.$set(vm.userProfile, 'age', 27)
有時你可能須要爲已有對象賦予多個新屬性,好比使用 Object.assign() 或 _.extend()。在這種狀況下,你應該用兩個對象的屬性建立一個新的對象。因此,若是你想添加新的響應式屬性,不要像這樣:
Object.assign(vm.userProfile, { age: 27, favoriteColor: 'Vue Green' })
你應該這樣作:
vm.userProfile = Object.assign({ }, vm.userProfile, { age: 27, favoriteColor: 'Vue Green' })
<li v-for="n in evenNumbers">{{ n }}</li> data: { numbers: [ 1, 2, 3, 4, 5 ] }, computed: { evenNumbers: function () { return this.numbers.filter(function (number) { return number % 2 === 0 }) } }
在計算屬性不適用的狀況下 (例如,在嵌套 v-for 循環中) 你可使用一個 method 方法:
<li v-for="n in even(numbers)">{{ n }}</li> data: { numbers: [ 1, 2, 3, 4, 5 ] }, methods: { even: function (numbers) { return numbers.filter(function (number) { return number % 2 === 0 }) } }
<div> <span v-for="n in 10">{{ n }} </span> </div> ==> 1 2 3 4 5 6 7 8 9 10
<ul> <template v-for="item in items"> <li>{{ item.msg }}</li> <li class="divider"></li> </template> </ul>
<ul v-if="todos.length"> <li v-for="todo in todos"> {{ todo }} </li> </ul> <p v-else>No todos left!</p>
------- end -------