变化检测顾名思义就是检测数据发生变化时,响应数据的更新。
它分为两种类型:一种是推,一种是拉;Angular和React的变化检测都属于’拉‘。就是说,当状态发生变化时,它不知道哪个状态发生变化,就发送一个信号给框架,框架使用暴力检测DOM来更新状态。这也是Angular脏检查的原理,React使用虚拟DOM的原理。
而Vue.js是使用’推‘的形式,就是一定程度上知道哪个状态发生了变化,从而进行更新。但是它的依赖相对来说也会比较多。
有两种方式可以检测到变化:Object.defineProperty和ES6的Proxy。
Object.defineProperty(obj, prop, desc)
**Object.defineProperty()的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性。**
obj 需要定义属性的当前对象
prop 当前需要定义的属性名
desc 属性描述符
如:let Person = {}
Object.defineProperty(Person, 'name', {
value: 'jack',
writable: true // 是否可以改变
configurable:true
})
由于ES6在浏览器的支持度不是很理想,所以Vue.js(2.x.x)是用Object.defineProperty来实现的。
Vue在初始化实例时对属性执行了getter/setter的转化,所以属性必须在data()上才能被Vue转化成响应式。(深入响应式原理)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。