浅谈MVVM的个人理解
从最简单的MVC说起,MVC经历过MVP,后来又出现MVVM,把C进化成了VM;在我看来,现在我们广泛谈到的MVC,其实就涵盖了MVP和MVVM,因为无论是P还是VM,都是Controller的变体。而Controller的作用就是一个控制器,最原始的前端JSP时代,Controller处理完之后返回的是页面的地址,返回的内容和前端的界面是对应的,只要界面需要改动,那么Controller也需要进行改动。注意我说的是最原始的MVC,并不是前边所提到的广义MVC。
而MVP的出现就是解决了,频繁的修改Controller,他把Controller和View的交互单独抽离出Presenter,这样在层次上更加清晰也,可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部;但是在MVP的结构下View 与 Model 不通信,都通过 Presenter 传递。Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。View 非常薄,不部署任何业务逻辑,称为”被动视图”(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。因为Presenter本质上就是多分了一层,在逻辑结构上更清晰。把原来View与Module频繁交(交互最终还是Controller派发)互转变成了与Presenter的交互。一旦视图变更了,presenter也要变更。
MVVC的这个说法我是在接触到Vue的项目,才听说的。提起MVVM就离不开 项目前后端分离。其实VC代替了P,这个说法把重点放在了VM上,并不是说整个流程没有了C,MV(C)VM,这个C永远都是Controller,他负责处理和派发。然而VM被作为亮点,在我看来是因为Vue.js的 数据双向绑定+数据驱动视图。
借用一个Vue的图片说明在Vue中VM发生的时机

ViewModule的步骤被Vue所隐含了,也就是说在Vue中,当你的视图定义出结构(template中的table等),在数据域(data)中定义了数据。在定义时进行数据绑定的声明。此时就完成了VM的流程。所以后端只需要传数据过来,数据与视图的绑定丢给VM完成。
所以,为什么前后端能分离?能分离,正是因为后端的数据不需要和视图绑定,把单纯的数据接口作为桥梁,只需要数据以规定的格式正确的拿给前端,将渲染的工作在前端集成实现。前端接收到数据,利用ViewModule进行数据的渲染。至此前后端完成了分离。前端不需要在意后端的数据逻辑,后端不需要在意前端的渲染。
M-V-VM
M:Module,数据模型。
V:View,视图界面。
VM:ViewModule,逻辑代码加上界面渲染的代码。

浙公网安备 33010602011771号