# 简介

我们都知道,Vue是一个MVVM框架。MVVM采用双向数据绑定,View中数据变化将自动反映到ViewModel上,反之,Model中数据变化也将会自动展示在页面上。把ModelView关联起来的就是ViewModelViewModel负责把Model的数据同步到View显示出来,还负责把View的修改同步回Model

mvvm

那么问题来了,ViewModel是如何知道Model中的数据发生变化了呢?

# 什么是变化侦测?

变化侦测就是用来解决这个问题的

变化侦测,或称为状态追踪,是指监测数据的变化情况,并在发生变化时更新视图。

变化侦测可以分为两种类型:推(push)和拉(pull)。

AngularReact中,采用的是拉方式的变化侦测。这意味着当状态发生变化时,它并不知道具体哪个状态发生了变化,只知道可能有状态发生变化。然后,它会向框架发送一个信号,告知框架可能有变化发生。框架在接收到信号后,会进行一次全面的比对,以确定哪些DOM节点需要重新渲染。在Angular中,这个过程被称为脏检查,而在React中则使用了虚拟DOM

而Vue的变化侦测属于推方式。当状态发生变化时,Vue能够立即察觉,并且在某种程度上能够知道哪些状态发生了变化。因此,它具有更多的信息,可以进行更精细的更新操作。

接下来我们通过源码来学习Vue的数据变化侦测实现。