v-for能夠用來遍歷一個元素,而後渲染出一個列表!vue
當 Vue 正在更新使用 v-for 渲染的元素列表時,它默認使用「就地更新」的策略。若是數據項的順序被改變,Vue 將不會移動 DOM 元素來匹配數據項的順序,而是就地更新每一個元素,而且確保它們在每一個索引位置正確渲染。 啥意思?????數組
www.zhihu.com/question/61…bash
這篇文章直接講的明明白白!可是有個問題,我在此時此刻讀文檔,能夠很肯定的告訴你,官網上寫的是「就地更新」,可是我在查閱的時候,不少資料包括這一篇中,都是「就地複用」,我嚴重懷疑他倆是一回事,而後更名字了。而後我在寫一點本身的想法:性能
咱們在v-if條件渲染中提到過,Vue爲了提高性能,會對DOM進行高度的複用。那在v-for進行列表渲染的時候,若是元素的位置的發生了變化,好比第一個和第二個交換了位置,Vue並不會去相應的改變DOM的順序,而是就地更新,可是在更新中也不會傻傻的把元素所有刪除,再從新建立,而是會高度複用,若是不能複用,那隻能刪了從新來。這也就是爲何,在這篇知乎解答中,第一個input框中的值,沒有發生改變。由於input被複用了,而給定屬性key,vue會認爲即便DOM元素能夠複用,但他倆仍然是徹底不一樣的倆玩意兒,就不會複用了。spa
咱們都知道,Vue使用了雙向綁定,也就是vm層數據的變化必定會相應的在v層上獲得體現。好比咱們去列表渲染一個數組中的元素,當向數組中push一個元素的時候,視圖層必定會改變。可是,咱們回過頭在思考,若是是簡簡單單的push操做,數組的引用不會改變,那憑什麼能被響應呢?設計
Vue重寫了push方法(變異),這些變異的方法會改變原數組雙向綁定
除了push,還有不少變異方法。code
它們不會改變原數組 而是返回一個新的數組cdn
Vue並不能檢測如下數組的變更:對象
第一種狀況的解決方法:
// Vue.set解決
Vue.set(vm.items,indexOfItem,newValue)
vm.$set(vm.items,indexOfItem,newValue) //經過實例方法,該方法是Vue.set的一個別名
複製代碼
// 使用變異的splice方法
vm.items.splice(indexOfItem,1,newValue)
複製代碼
第二種狀況的解決方法:
vm.items.splice(newLength)
複製代碼
// Vue.set解決
Vue.set(object,propertyName,value)
vm.$set(object,propertyName,value) // Vue.set的別名
複製代碼
vm.userProfile = Object.assign({},vm.userProfile,{
age: 27,
favoriteColor: 'Vue'
})
複製代碼
<li v-for="n in 10">{{n}}</li> // 1 2 3 4 5 6 7 8 9 10
複製代碼