vue深入响应式原理----学习总结

 

什么是响应式原理?

    var vm = new Vue({}),这样创建一个实例对象的时候,传入的对象作为data选项, Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter。            Object.defineProperty 是 ES5 中一个无法 shim 的特性,这也就是 Vue 不支持 IE8 以及更低版本浏览器的原因    。

 

 

响应式原理核心:Object.defineProperty进行数据劫持同时结合观察者模式来实现数据双向绑定。

注意的问题?

1、shim又是什么?

  简单的说  Object.defineProperty这个特性无法使用低版本浏览器的方法实现。

2、vue初始化实例的时候,对属性执行 getter/setter 转化,所以属性必须在 data 对象上存在才能让 Vue 将它转换为响应式的。

    例如:

    var vm = new Vue({

        data:{

           a:1,

   msg:' '

   }

    })

    vm.a    //是响应式的

    vm.b = 2 //是非响应式的因为没有这个属性。

    所以你必须在初始化实例前声明所有根级响应式属性,哪怕只是一个空值

3、对于已经创建的实例,可以使用

   Vue.set(object, propertyName, value) 去修改属性。

Vue.set(vm.someObject, 'b', 2)

   或者用vm.$set 实例方法,这是 Vue.set 方法的别名

this.$set(this.someObject,'b',2)

   如果要给已有对象赋值多个新属性,比如使用 Object.assign() 或 _.extend()这样的方法。但是,这样添加到对象上的新属性不会触发更新。在这种情况下,你应该用原对象与要混合进去的对象的属性一起创建一个新的对象。

// 代替 `Object.assign(this.someObject, { a: 1, b: 2 })`
this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })

 

posted @ 2019-05-27 20:41  一定要像风一样自由  阅读(307)  评论(0编辑  收藏  举报