面试题答案
一键面试1. 数据响应式系统
在Vue中,当一个Vue实例创建时,Vue会通过Object.defineProperty()
方法将数据对象的每个属性转换为getter/setter
。这一过程被称为数据劫持。每个数据属性都对应一个Dep
实例,Dep
是依赖收集器,它收集所有依赖这个数据的Watcher
。
2. 数据变化触发响应式系统
当数据发生变化时,即属性的setter
被调用,Dep
会通知所有依赖它的Watcher
,告诉它们数据已经改变,需要进行更新。
3. Watcher的作用
Watcher
是一个中介角色,它订阅数据变化。每个组件实例都有一个对应的Watcher
实例,这个Watcher
实例在组件渲染的过程中会“接触”(读取)所有“依赖”的数据属性,从而将该组件的Watcher
添加到这些数据属性对应的Dep
中。当数据变化时,Dep
通知Watcher
,Watcher
会执行相应的更新操作。
4. 响应式系统与虚拟DOM的交互
当Watcher
接收到数据变化的通知后,它会触发重新渲染。但Vue并不是直接操作真实DOM,而是创建一个新的虚拟DOM树。新的虚拟DOM树会与旧的虚拟DOM树进行对比(这一过程称为diff算法)。通过对比,找出差异,只对差异部分进行真实DOM的更新,从而实现高效的视图更新。
5. Dep的作用
Dep
作为依赖收集器,负责收集依赖(即Watcher
)。每个数据属性有一个Dep
实例,当数据属性被访问(getter
调用)时,会将当前的Watcher
添加到Dep
中;当数据属性发生变化(setter
调用)时,Dep
会遍历所有收集到的Watcher
,通知它们数据已改变,触发更新。
通过数据响应式系统、虚拟DOM、Watcher
和Dep
的协同工作,Vue实现了高效的视图自动更新机制,提升了应用性能。