变化检测顾名思义就是检测数据发生变化时,响应数据的更新。
它分为两种类型:一种是推,一种是拉;Angular和React的变化检测都属于’拉‘。就是说,当状态发生变化时,它不知道哪个状态发生变化,就发送一个信号给框架,框架使用暴力检测DOM来更新状态。这也是Angular脏检查的原理,React使用虚拟DOM的原理。
而Vue.js是使用’推‘的形式,就是一定程度上知道哪个状态发生了变化,从而进行更新。但是它的依赖相对来说也会比较多。

有两种方式可以检测到变化:Object.definePropertyES6的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转化成响应式。(深入响应式原理)


敏小静
55 声望3 粉丝

前端工程师