什么是响应式原理?
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 })