首先要明确 MVVM 是什么,它是 MVC 的衍生架构。无论是 MVC 还是 MVVM 都不是只针对于前端或后端开发的,它们是针对于所有软件开发的架构。
MVC
在 MVC 中,Mode 是数据,View 是用户看到的视图,Controller 是处理逻辑。用户触发 Controller(比如后端被http驱动,有一个明显的Control入口,其他场景中也有可能在 View 触发), Controller 运行逻辑改变 Model,Model 用变动后的数据更新 View 。
MVVM
MVVM 也被称为 model-view-binder。MVVM 中,VM 是 ViewModel。View 与 ViewModel 之间采用数据绑定,绑定是双向的,避免了开发人员写一些同步 ViewModel 和 View 的重复逻辑。通过数据绑定,View 发生变化会自动反映到 ViewModel,ViewModel 产生的变化也会自动更新 View。
ViewModel 创建了一个视图的抽象,将视图中的状态和行为抽离出来。
在 MVVM 的实现中,还引入了隐式的一个 Binder 层,而声明式的数据和命令的绑定在 MVVM 模式中就是通过它完成的。
Vue、React 与 MVVM
Vue 是一个提供了 MVVM 风格的双向数据绑定的框架。它的核心是 MVVM 中的 VM,也就是 ViewModel。 ViewModel负责连接 View 和 Model,保证视图和数据的一致性。
在 Vue 中,Model 和 VM,VM 和 和 View 之间都是双向数据绑定,实现方式是数据劫持。
但是在 Vue 中,哪一部分是 VM,哪一部分是 M,其实不太好区分。如果 Vue 的一个实例是 VM,那么 model 是什么?如果 data 是 model,先经过实例中的逻辑改变 data,然后 view 产生变化又不符合 MVVM。或者说 VM 是 Vue 框架实现数据响应的源码,实例中的逻辑是 model 层的逻辑,用于改变 model 。所以,个人认为 Vue 只能说是有 MVVM 风格的框架,不能说是一个 MVVM 框架。
react,单向数据流。本身只是 一个函数 ui = render (data) 官方就这么简单一个公式。加上状态管理等,可以做 MVVM 风格的开发。
不管是 MVC 还是 MVVM ,具体到实际框架,组成成分之间都不会泾渭分明,几种组成成分之间常常有难以划分的模糊地带。如果忽略划分细节从整体来看,Vue 参考但没有完全遵循 MVVM,React 只是一个 View 层。