0013. 谈谈你对 MVVM 模式的理解,可以对比 MVC 来讲讲。
📝 summary
- 这是一道面试题,可以从以下这些角度来回答该问题。
- MVVM 是什么
- MVC 是什么
- MVVM 和 MVC 之间的主要区别
📒 notes - 参考回答
- MVVM
- 参考图
- 灰色 ViewModel 表示这部分逻辑对开发者而言默认是隐藏的,是框架帮我们处理好的。Model、View 之间的数据双向绑定响应式框架已经做好了(比如 Vue),我们只需要关注数据和界面行为的定义就行,不需要管数据和界面的同步问题。
- MVVM 是 Model-View-ViewModel 的缩写,即 模型(Model) ➕ 视图(View) ➕ 视图模型(ViewModel)。它是一种设计思想、设计模式,核心通过中间层 ViewModel 来实现数据和视图的双向绑定。
- M 是 Model 的缩写,它表示 数据模型层,这些数据可以是本地的,也可以是来自后端服务接口的。我们可以在 Model 层中编写数据读写相关的业务逻辑。简单来说,这里的 M(Model)就是我们的 数据。数据模型层对用户而言是 不可见 的。
- V 是 View 的缩写,表示视图层,也就是我们的页面、我们的 UI 组件,简单讲就是用户能够看到的界面部分。比如在开发 vue 项目的时候,你可能会看到 src/views 目录,这个 views 目录下的内容就是所谓的页面视图。
- Model 层对于用户而言是不可见的,而 View 层对于用户来说是可见的。
- VM 是 ViewModel 的缩写,它表示视图模型,它是 MVVM 模式的核心,是连接 View 和 Model 的桥梁。主要有俩功能,当这俩功能都实现时,我们也称之为 数据的双向绑定 —— 1. 数据变化 -> 视图更新;2. 视图更新 -> 数据变化。
- 将数据模型(Model)转为视图(View),主要通过 数据绑定 来实现,按照命令式编程的方式来表示,大致可以这么写 dom.innerText = x1、dom.innerHTML = x2,就是将我们的数据 x1、x2 给绑定到视图(View)上,将相关数据呈现给用户看。
- 将视图(View)转为数据模型(Model),主要通过监听 DOM 事件 来实现,当界面上某些行为发生时,同步更新程序中的数据。
- 在 MVVM 架构下,View 和 Model 之间并没有直接的联系,而是通过 ViewModel 进行交互, Model 和 ViewModel 之间的交互是双向的, 因此 View 数据的变化会同步到 Model 中,而 Model 数据的变化也会立即反应到 View 上。
- ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而 View 和 Model 之间的 同步 工作完全是自动的,无需人为干涉,也就是说对于开发者而言,这个同步的处理逻辑是 不可见 的,是框架内部已经处理好的,因此开发者只需关注业务逻辑,不需要手动操作 DOM,不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。
- 参考图
- MVC
- 参考图
- Controller 没有使用灰色,意思是在说这部分的控制逻辑,是需要开发者手写的。当视图上发生某些行为的时候,需要手写 Controller 来控制 Model 和 View 的更新。
- MVC 是 Model-View-Controller 的缩写,即 模型(Model) ➕ 视图(View) ➕ 控制器(Controller)。MVC 和 MVVM 一样,也是一种设计思想、设计模式。其核心在于通过控制器来承上启下。其中的 M、V 和 MVVM 中的 M、V 是一样的,分别表示数据模型层和视图层。
- 对比 MVC 和 MVVM
- MVVM 帮开发者做的事儿比 MVC 更多,开发者在 MVVM 中只需专注于定义数据和行为,而 MVC 中则需要自己写 Controller 来处理用户操作和更新界面。
- 参考图
- 补充
- 上网搜了一下 MVVM 和 MVC 的图,发现各种画法都有,并不统一。每个人或团队可能会根据自己的理解和需求来绘制这些图表。不过核心元素基本都是一致的,比如图表里面都有 Model、View、ViewModel、Controller 这些元素,不同点主要体现在连线上。
- 上述内容也仅仅是记录个人当前的一些理解,一定是不够全面的,在回答这类问题的时候,谈谈自己的理解就行,知道啥说啥,等面试官追问再进一步补充说明。