1.Vue动态响应数组
Vue
的核心思想之一,动态响应能够简单理解为:数据更新→视图更新;视图更新→数据更新,这里的数据分为对象
和数组
;Vue
处理对象的方式是经过Object.defineProperty
劫持数据,经过getter
和setter
来处理;③数组:经过劫持数组的原型方法;将全部可能使得数组产生变化的方法劫持,当数据调用这些方法的时候,dep.notify()
,会通知依赖于此数据的视图update()
;可是这样作会产生2个问题,以下:app
['push','pop','shift','unshift','splice','sort', 'reverse'] .forEach(function (method) { const original = arrayProto[method] def(arrayMethods, method, function mutator (...args) { const result = original.apply(this, args) …… //通知变化 ob.dep.notify() return result }) })
2.看看几个案例this
this.arr[index] = newValue
赋值的方式不能更新视图;②经过this.arr.length = 0
,经过改变数组长度去改变数组,视图也不能更新;
①②虽然没有更新视图可是须要明白的是this.arr
的数据是改变了的,只是没有通知依赖的数据更新;这是因为Vue
没有作相应的处理。spa
<p v-for="(item,index) in arr" :key="index">{{item}}</p> <button v-on:click="change">Click Me</button> data: {arr: [1, 3, 4, 5, 6],}, methods: { change: function () { this.arr[1] = 0; this.arr.length = 0;}}
③混合方式
如果①②和数组劫持了的方法一块儿使用,前面两种方法是起做用的;下图方法一
和方法二
的结果是不同的,以下图所示,这也说明了在①和②中,数据是改变了的,只是视图没有更新。code
//方式一 change: function () { this.arr[1] =0; this.arr.reverse()} //方式二 change: function () { this.arr.reverse() this.arr[1] =0;}