网络宝典
第二套高阶模板 · 更大气的阅读体验

MVC和MVVM到底有啥不一样?新手一看就懂

发布时间:2026-03-24 06:30:53 阅读:4 次

写网页时经常听到 MVCMVVM,听起来都带个 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),工具是为人服务的,菜熟了,吃得香,才是正经事。