MVC与MVVM的区别
MVC
对于前端而言,数据变化无法同步到视图中。需要将逻辑聚拢在controller层
-
传统的 MVC 指的是,用户操作会请求服务端路由,路由会调用对应的控制器来处理,控制器会获取数 据。将结果返回给前端,页面重新渲染
-
经典MVC模式:Backbone + underscore + jquery
含义
-
M:model,模型层。代表数据库中的数据源,负责数据的处理和获取的数据接口层。
-
V:view,视图层。代表能看到的客户端页面,比如由html元素组成的网页界面,或者软件的客户端界面。,是根据模型数据创建的。
-
C:controller,控制层。代表业务逻辑,是模型层和视图层之间的桥梁,建立两者之间的关系。控制层本身是不会处理数据以及输出数据,他只是用来接受请求并决定用那个模型去处理请求,然后再确定用哪个视图来显示返回的数据。
- 假设用户进行一个input事件,这个事件就会在controller进行一个中转,通过controller去model里面获取数据,之后会返回给controller,controller接收到数据之后会返回给view,最后展示在页面上。所以说,controller相当于一个中转站。
优点
- 耦合性低:视图层和业务层分离,这样允许更改视图层代码而不用重新编译模型和控制器代码,改变其中一个不会影响到其他两个,所以这种设计思想有良好的松耦合的构件
- 重用性高:MVC模式允许各种不同样式的视图来访问同一个服务的代码,因为多个视图能共享要给模型数据。
- 部署快:使用MVC模式开发时间相当大的缩减,它使程序员集中精力在业务逻辑上,视图与业务逻辑分开。
- 生命周期成本低:MVC使开发和维护用户接口的技术含量降低。
- 可维护性高:分离视图层和业务层逻辑也是WEB应用更易于维护和修改。
- 有利于软件工程化管理:由于不同的层各司其职,每一层不同的应用具有某些特性,有利于通过工程化、工程化管理程序代码,可以使用控制器来连接不同的模型和视图去完成客户的需求.控制器可以根据用户需求选择模型进行处理,然后选择视图处理结果显示给用户
- 功能模块分离:能将应用程序的各个功能模块分离开来,提高代码的可维护性和可扩展性
缺点
- 不适合小型,中等规模的应用程序。
- 视图与控制器间的过于紧密的连接并且降低了视图对模型数据的访问。
MVVM
- 传统的前端会将数据手动渲染到页面上, MVVM 模式不需要用户收到操作 dom 元素,将数据绑 定到viewModel 层上,会自动将数据渲染到页面中,视图变化会通知 viewModel层 更新数据。 ViewModel 就是我们 MVVM 模式中的桥梁
- 严格的MVVM模式中,View层不能直接和Model层通信,只能通过ViewModel来进行通信。
- 映射关系的简化 (隐藏controller)
含义
-
M:model,模型层。代表渲染页面所依赖的数据源,是通过Ajax从服务端获取回来的数据,这些数据是用来将来渲染到页面上的。
-
V:view,视图层。负责将数据模型转化为UI展示出来呈现给用户,可以简单的理解为HTML结构。
-
VM:视图模型层,用来连接Model和View,是Model和View之间的通信桥梁。是vue的实例,是MVVM的核心。它的作用是当监听到DOM变化时,会自动的更新数据源里面所依赖的数据。而当修改了model数据源里面的数据时,VM又会自动的重新渲染页面。
-
MVVM实现了数据驱动视图和数据的双向绑定。
-
Model ---- View ---- VM(ViewModel)
优点
-
低耦合:视图View可以独立于Model变化和修改,一个ViewModel可以绑定到不同的View上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
-
可重用性:可以把一些视图逻辑放在ViewModel里面,让很多view重用这段视图逻辑。
-
独立开发:开发人员可以专注业务逻辑和数据的开发,设计人员可以专注页面设计。
-
可测试:界面向来比较难预测时,测试可针对ViewModel来写。
-
数据驱动
-
VM提供数据的双向绑定
Vue涉及思想
- Vue并没有完全遵循MVVM模型(Vue只是其中的响应式原理遵循的是MVVM)
- Vue可以不直接通过viewModel来操作视图,可以手动把数据挂载到视图上(例如:ref)
React涉及思想
- React 只是做V层,视图层
区别
- 都是一种设计思想
- MVC后端用的多,而MVVM是前端设计思想
- 在MVC里,view是可以直接访问Model的,所以View里会包含Model信息以及一些业务逻辑
- MVC模型关注的是Model的不变,所以在MVC模型里,Model不依赖于View,但是View依赖于Model
- MVC是单向通信,数据模型必须通过Controller层进行承上启下。
- MVVM是将View和Model实现自动同步,当Model属性改变时,不用再自己手动操作Dom元素,提高页面渲染性能
- 在概念上真正将页面与数据逻辑分离的模式
- 将数据绑定工作放到一个JS里去实现,而这个js文件的主要功能是完成数据的绑定,即把model绑定到UI的元素上
- 双向绑定,方便去同时维护页面上都依赖于某个字段的N个区域,而不用手动更新它们
MVVM并不是用ViewModel完全取代了controller,mvvm只能算是mvc的升级版,viewModel存在目的在于抽离controller中展示的业务逻辑,而不是替代controller,其他视图操作业务等还是应该放在controller中实现