# MVVM
# 1、MVC
先看一下MVC

将整个前端页面分成View,Controller,Modal,视图上发生变化,通过Controller(控件)将响应传入到Model(数据源),由数据源改变View上面的数据。
整个过程看起来是行云流水,业务逻辑放在Model当中,页面渲染逻辑放在View当中,但在实际运用上却存在一个问题:那就是MVC框架允许View和Model直接进行通信!!
换句话说, View和Model之间随着业务量的不断扩大,会出现非常复杂的难以处理的依赖关系,完全背离了开发所应该遵循的开放封闭原则。为了解决这个问题,MVVM出现了。
# 2、MVVM
MVVM和MVC的主要区别有2点
- 数据和视图之间是分离的, 不直接通信
- 通过数据模型来驱动视图,开发者只需要关注数据变化, DOM操作被封装了。

MVVM分别指View,Model, ViewModel。View通过ViewModel的Dom Listeners将时间绑定到Model上,Model通过ViewModel的Data Bindings来管理视图, ViewModel则起到其中一个连接的作用。
# 3、MVVM的实现原理
以Vue举例,主要有三个核心的点
- 响应式。Vue监听data的属性变化。defineProperty或者Proxy
- 模板渲染。模板解析成一个渲染函数, 渲染函数的作用域上下文就是当前Vue实例,可以读取到Model的数据。
- 渲染。模板渲染成DOM
# 4、Vue
MVVM全称Model View ViewModel,分别指“数据模型层、“视图层”、“用于视图的数据模型层”。
1.出于特别场景方便的目的,Vue允许通过指令、$refs等直接操作DOM,而不是完全通过MVVM模式要求的ViewModel自动映射View。只不过建议克制。
2.Vue的实例是一个ViewModel,简单场景下直接吞并了Model的存在。在全局状态的场景下,Vuex可以视为半个Model。没有Model的MVVM,是不完整的。