原理概述

Vue.js 的核心在于将数据模型视图解耦,通过响应式的机制自动更新视图。

  • 数据劫持: Vue会在组件初始化之前,对数据对象进行遍历劫持,使用Object.defineProperty(ES5)或 Proxy(ES6)将每个属性转化为getter/setter,从而实现对数据对象的监听.

  • 依赖收集(追踪):当组件的数据对象中某个属性被访问时,Vue会收集对该属性的依赖,记录依赖的组件和对应的watcher对象,并在属性值被变化时,会触发相应的 setter 操作,然后通知其对应的watcher进行更新,触发对应的回调函数,应用到对应的视图上。

  • 派发更新: 当组件的数据对象的某个属性被修改时,Vue会触发一个更新过程,首先会将新的值赋值给该属性,然后再触发该属性的依赖Watcher对象,并通知这些依赖进行更新视图。


扩展1:全局的依赖调度器
全局的依赖调度器被称为监听者管理器(Watcher Manager),是用来管理组件的 Watcher 对象数据的 Dep 对象的全局管理器

扩展2: 更新过程

1、Vue会对每个Watcher对象进行一次求值,以确定该Watcher对象是否收到属性变化的影响,被影响,将Watcher对象放入更新队列中,用于更新视图。

2、如果多个Watcher对象收到属性的变化影响。Vue会对这些Watcher对象进行去重,避免更新相同视图。

3、按照Watcher对象的优先级(非遍历),更新队列中的Watcher对象,触发Watcher对象的回调函数,将变化同步到相应的视图中(Vue.js 可以将最小化的视图更新次数,提高应用的执行效率和响应速度)。

扩展3: Watcher对象的优先级

1、计算属性的Watcher对象的优先级 > 普通渲染数据Watcher对象的优先级
2、在创建 Watcher 对象时,Vue.js 会根据其类型和创建方式,将其优先级设置为不同的值。

扩展4: Watcher对象的求值

1、Watcher对象有一个get()方法,用于求值,决定当前对象是否需要更新视图。
2、在Watcher对象被创建时,会自动执行一次get()方法,去初始化Watcher对象的状态,从而完成依赖收集。

结束语


总结:大功告成✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️✌️