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
复制代码