vue2.x中如何监测数组和对象变化?
-
Object通过Object.defineProperty结合递归就能实现
- 比较麻烦就对了,Proxy就直接代理整个对象
-
Array的话 Vue将data中的数组进行了原型链重写,指向了自己定义的数组原型方法。
-
数组某些情况下会不刷新视图,我们这样解决
- 当利用索引直接设置一个数组项时,例如vm.items[indexOfItem] = newValue
//使用该方法进行更新视图 // vm.$set,Vue.set的一个别名 vm.$set(vm.items, indexOfItem, newValue) 复制代码
- 当修改数组的长度时,例如vm.items.length = newLength
//使用该方法进行更新视图 // Array.prototype.splice vm.items.splice(indexOfItem, 1, newValue)
Proxy比Object.defineProperty好在哪?
「Vue3.x改用Proxy替代Object.defineProperty」
-
Object.defineProperty 只能劫持对象属性的getter和setter方法
- Proxy 是直接代理劫持整个对象
-
Object.definedProperty 不支持数组(可以监听数组,不过数组方法无法监听自己重写),更准确的说是不支持数组的各种API(所以VUE重写了数组方法
- Proxy可以直接监听对象和数组的变化,并且有多达13种拦截方法。
-
Proxy 会返回一个代理对象,我们只需要操作新对象即可,而 Object.defineProperty 只能遍历对象属性直接修改
-
Object.definedProperty唯一比Proxy好的一点就是兼容性,不过相信Proxy新标准将受到浏览器厂商重点持续的性能优化