vue2代码:
methods:{
test(){
//this.arr[0] = {name:"new"} //这个不会更新视图
this.arr[0].name = "new" //这个会更新视图
}
}
我知道vue2中更新的数组方法是:
重写的七大原生方法: push 、pop、shift 、unshift 、splice 、sort 、reverse
或者vue2中响应的Vue.set()方法
我知道更改下标不会产生视图更新
我大概能理解上面的代码为什么会更新,但是,不是很明白,怎么表述
或者你从template里面直接去渲染了一个数组 v-for,然后 click=(scope.row),这个row不就是数组对象下的某个对象吗?那为什么[{}],{}内容变化,视图就可以直接更新呢?不用太纠结这些东西,再有这些其实数据已经变化了,只是视图没有变更,用$focusUpdate()重载一下也可以
这段代码之所以会更新视图,是因为Vue2对数据进行了劫持(响应式)处理。在这个过程中,Vue2会使用Object.defineProperty方法将数组中的每个元素都转换为getter和setter,从而可以在修改数组中元素的属性时监听到变化并更新视图。
因此,当在test方法中通过this.arr[0].name = "new"来修改数组中第一个元素的name属性时,Vue2会监听到这个变化并触发视图的更新。而如果直接使用this.arr[0] = {name:"new"}来替换数组中第一个元素,由于这种方式并没有修改该元素的属性,Vue2就无法监听到变化,也就不会触发视图的更新。
如果直接给数组赋值一个新的对象,Vue会认为这是一个新的引用,并不会触发响应式更新,
当修改对象的属性时,Vue会检测到属性的变化,并触发响应式更新