写网页时经常听到 MVC 和 MVVM,听起来都带个 V(View),还都有 M(Model),搞得人一头雾水。其实它们不是“谁更好”,而是解决不同场景下的分工问题。
先看 MVC:老派但扎实
MVC 是上世纪70年代在 Smalltalk 里诞生的,后来被用在 Rails、ASP.NET Web Forms、Spring MVC 这些后端框架里,也影响了前端早期开发思路。
它把代码拆成三块:
- M(Model):管数据,比如从数据库查用户信息、校验手机号格式;
- V(View):纯负责展示,比如一个 HTML 表单,只渲染不处理逻辑;
- C(Controller):当“中间人”,接收用户点击或提交,调 Model 拿数据,再把结果塞给 View 渲染。
举个例子:你点“加载订单列表”按钮,Controller 收到请求 → 找 Model 去数据库查 → 把订单数组传给 View → View 生成一堆 <li> 标签塞进页面。
这时候 View 是被动的,基本不自己动,全靠 Controller 推着走。
再看 MVVM:为现代前端而生
MVVM 是微软在 WPF 时代提出来的,后来被 Knockout.js 带火,Vue 和 Angular 都受它启发。它更适合操作 DOM 频繁、交互多的单页应用(SPA)。
结构上也是三块:
- M(Model):还是数据层,比如 { name: '张三', balance: 128.5 };
- V(View):还是界面,但这次它能“说话”了——支持指令式绑定,比如 v-model、{{ name }};
- VM(ViewModel):关键角色!它不是控制器,而是一个“响应式桥梁”。它暴露数据属性,也封装方法,并且自动监听 Model 变化、同步更新 View,反过来用户输内容,View 也能自动改 VM 里的值。
比如 Vue 里这样写:
<div id="app">
<input v-model="message" placeholder="改这里试试">
<p>你输入的是:{{ message }}</p>
</div>
<script>
const app = new Vue({
el: '#app',
data() {
return { message: 'Hello' }
}
})
</script>你改 input,message 自动变;message 在 JS 里被赋新值,页面立刻刷新——不用手动找 DOM、不用反复 innerHTML,VM 全包了。
核心区别在哪?
通信方式不同。
MVC 是“单向命令流”:用户操作 → Controller → Model → Controller → View 更新。Controller 手动控制每一步。
MVVM 是“双向自动同步”:View ↔ ViewModel ↔ Model,靠数据绑定和响应式系统驱动,开发者只管维护 VM 的状态。
View 的角色变了。
MVC 的 View 是“哑巴”,只听 Controller 安排;MVVM 的 View 是“半自主”的,能主动绑定、触发事件、甚至带局部逻辑(比如 v-if、v-for),更贴近前端工程师日常写的 HTML + JS。
适用场景也不一样。
如果你做的是传统表单提交、页面跳转频繁的后台管理系统(比如用 Thymeleaf 渲染的 Spring Boot 项目),MVC 很清爽;如果你做的是像钉钉审批页、在线表格编辑器这种需要实时反馈、局部刷新的界面,MVVM(或类 MVVM 思路)明显更顺手。
别被名字吓住
其实 MVC 和 MVVM 都不是什么高深玄学,本质都是为了让人脑不乱:把数据、界面、逻辑分开放,改一处不牵连八处。选哪个,真没必要死磕理论,看看你用的框架倾向什么、团队熟悉哪套、需求要多“动”就差不多了。
就像做饭——蒸鱼用蒸锅(MVC),炒青菜用炒锅(MVVM),工具是为人服务的,菜熟了,吃得香,才是正经事。