结合vue、react、angular谈谈MVC、MVP、MVVM框架

首先,在谈这个话题之前, 我们有必要了解一下库和框架的区别。

我们先来看react官网以及vue官网对他们的定位:

react:

vue:

react我们不说了,官网上明明白白说了,人家是一个library,用于构建用户界面。

vue的官方文档是说vue的核心库也只是关注视图(View)层。

所以,实际上来说,和angular有完整的解决方案不同,狭义的vue.js和react.js实际上只是library,还并不是一个framework,因为他们没有一整套的解决方案。

换句话来说,现在我们所讨论的vue、react,都是我们将他们武装之后,他们有了一整套解决方案了。成为了一个框架,我们再来讨论他们的架构模式。

下面两层是不变的,先提前声明:

Model(数据模型): 原始数据模型的管理。

View(视图):用户接触操作的页面。

MVC:

Controller(应用逻辑控制层):将用户的操作反馈给Model,通知其进行数据更新,业务逻辑的中心。

 

我们可以先暂时抛开框架,MVC的流程大概就是,html(View)操作,告知js(Controller)要更新数据(Model)啦,js(Controller)经过请求也好啥也好,更新了数据(Model),然后再告诉html(View)找指定的UI节点去更新数据。当然这里也可以直接由js(Controller)发起对数据(Model)的更新,流程差不多也是一样的。

其实流程列出来我们就可以看到,这样的架构模式在早期的web应用中可以适应的很好。因为早期的web应用,页面的作用基本也就作为数据展示使用。Model层可以将数据处理好后通知View层渲染,就像jquery拿到ajax数据之后找到元素一顿innerHtml啥的。

但随着web的发展,业务逻辑的复杂,可以发现这种架构模式以下两个问题:

1、View更新的时候,必须要通过Controller去更新一遍Model;同样的Model更新的时候,也要去更新一遍视图。此时开发者是在同时维护View层和Model层。当页面复杂的时候,开发者不得不做许多繁琐的工作来保证数据的状态、页面的展示都是正确的。

2、View层与Model层耦合,复用性差。比方说,我点击一个按钮,更新了Model并将数据渲染为List;这是我再点击一个按钮,同样更新这份数据但是渲染为Table。这个时候,由于之前逻辑已经连成一块,我们不得不再写一套渲染代码。

3、同样是由于View和Model耦合,数据流会十分混乱。比如改变了Model,这时View的更新又触发了另一个Controller,使得另一个Model又更新了,这就会使数据流像意大利面条一样缠在一起。

MVP:

诶这个时候我们想,好像这个Controller并没有什么卵用啊,就传递一下信号就完事儿了。不行,活干的这么少,让他再多干点!

如果我们能将数据返回给Controller,让Controller来控制View的渲染,那么,View和Model不就释放了吗?于是,MVP模式诞生了,操作流如下图所示:

不过此时的Controller层变成了Presenter(中介者)层,Presenter层既能将页面操作告知Model进行数据更新,又能在数据更新时负责通知View进行更新视图,使View层与Model层解耦。

针对上述问题2,在MVP架构模式下,Model层将数据返回给Presenter,再由Presenter决定我是渲染Table呢,还是渲染List。这种架构模式下,加强了Presenter的职能,这样就解决了上述问题2、3。

但问题1依然存在啊!开发者依旧需要在Presenter中同时兼顾Dom和Data。

MVVM:

在此基础上,如果说视图层(View)与数据层(Model)是在某个环境下是绑定的,可以实现通过数据驱动视图,那么,上述两个问题,就都可以得到解决。于是MVVM诞生了,先看操作流:

在中间的ViewModel层中,会构建一份状态数据,视图层根据其渲染视图。这样, 开发者的精力被释放,只要聚焦在业务逻辑中。所以,我的理解是,MVVM就是实现了数据绑定的MVP,注意,是绑定,而不是双向绑定!!!(单向数据流和双向数据流)

----------------------------------------------------------------------------------------------

Vue

个人认为,这是毫无争议的一个MVVM框架,对MVVM理念的贯彻也是最显而易见的。

Model层:接口层,原始数据模型。

View层:视图层,template中的html代码。

ViewModel层:基于一个html元素构建的vue实例。将Model中的原始数据模型,构建成一份View层可以使用的视图模型。这个时候,Model层、View层完全解耦。开发者已经完全不需要顾及View的展示更新了,只需要专注业务逻辑以及ViewModel层与Model的交互逻辑就ok。

AngularJs

Model层:接口层,原始数据模型。

View层:html页面。

ViewModel层:基于ng-app构建的应用实例,与vue类似,数据双向绑定机制不同。

React

Model层:接口层,原始数据模型。

View层:编译之后的Dom。

ViewModel层:基于jsx语法,以及react构建的VDom,单向数据流。

这么一看,vue、react、angularJS不就都是MVVM框架吗?唯一的区别就是,VM层中的Model与View,vue与angular是数据双向绑定,而react由于是单向数据流,所以需要手动更改状态。

-----------------------------------------------------------------------------------------------

最后说下感受吧,其实之前一直以为自己是对这三种架构模式心里有底,但现在越看越绕,感觉归根结底就是,在结合现有框架进行分析的时候,对model 层与 中间层(c,p或vm)的边界界定十分模糊,没有一个清晰的划分。但是,现在想来也没必要这么钻牛角尖,其实吧,每一层专注于每一层的任务,这即是核心。在此基础上的扩展以及如何对代码进行组织管理,是看需求来界定的,这也是框架架构模式不断发展的原因。

最后的最后:由于只是用过这三个框,个人理解肯定存在局限性和不足的地方,希望各位大佬指正!!!!

参考(看了很多,感觉就这三篇算是干货比较多的):

前端框架模式的变迁

一篇文章了解架构模式:MVC/MVP/MVVM

MVC,MVP 和 MVVM 的图示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql emma_ubuntu mysql emma中文乱码问题解决

ubuntu mysql emma中文乱码问题解决emma默认用apt-get 安装的话,emma是不支持中文的,配置文件或直接修改emma程序源文件(python)。apt-get安装emmasudo apt-get install emmaubuntu的apt-get 安装emma是在/usr/share/emma目录下面。cd /usr/share/emma/e…

Vue(MVVM)、React(MVVM)、Angular(MVC)对比

前言 昨天阿里内推电面一面,面试官了解到项目中用过Vue,就问为什么前端框架使用Vue而不适用其他的框架,当时就懵了。因为只用过Vue,不了解其他两个框架,今天就赶紧去了解一下他们之间的区别。大家发现如果本文中哪个地…

.NET的MVVM框架

Model-View-ViewModel 是一种架构模式,主要在 WPF、Silverlight 和 WP7 开发里使用,它的目标是从视图层移除几乎所有代码隐藏(code-behind)。交互设计师可以专注于使用 XAML 表达用户体验需求,然后创建和视图模型的绑定…

mysql 索引 lt =_MySQL索引相关

MySQL索引采用的是BTREE,多列联合索引是一个有序元组,其中各个元素均为数据表的一列。设一个表有M列,建一个度为n的多列联合索引,深度h lognM,设一组索引列的大小为s,索引文件的大小可以计算为s*M*(1M/nM/…

.NET平台下开源框架

一、AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架。Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式。这种部署方面(aspects)的方法帮助缺少经验的开发人员提高开发效率。 NKalore是一款编程语言,它扩展…

mysql存储过程查询所有表_mysql存储过程利用游标查询每个数据库的所有表

DELIMITER $DROP PROCEDURE listAllDB;CREATE PROCEDURE listAllDB()BEGINDECLARE no_more_record INT DEFAULT 0;/*定义2个变量:temp用于记录游标每次next的值,schemaName表示将所有temp拼接后的值*/DECLARE schemaName varchar(500) DEFAULT ;DECLARE …

先进的ASP.NET开源工作流快速开发框架 - RoadFlow

.net可视化工作流引擎RoadFlow - 设计概述 RoadFlow是天知软件旗下基于.NET的工作流快速开发平台,由从事六年以上OA及工作流开发与实施的团队设计开发,该工作流平台已应用于众多大型企事业单位。拥有全浏览器兼容的可视化流程设计器、表单设计器、基于角…

view [bootstrap-4] not found如何解决_Dubbo如何处理业务异常,这个一定要知道哦

前言我们在开发应用系统时,不可避免的要使用到我们自己定义的异常,所以我们一般通常会用到自定义的业务异常类BusinessException,这个异常会继承extends RuntimeException,当发生业务限制的时候,会throw出来。问题在Sp…

c# 自定义应用程序配置文件(app.config)

1. 向项目添加app.config文件: 右击项目名称,选择“添加”→“添加新建项”,在出现的“添加新项”对话框中,选择“添加应用程序配置文件”;如果项目以前没有配置文件,则默认的文件名称为“app.config”&…

python爬取文件归类_python爬取各类文档方法归类汇总

HTML文档是互联网上的主要文档类型,但还存在如TXT、WORD、excel、PDF、csv等多种类型的文档。网络爬虫不仅需要能够抓取HTML中的敏感信息,也需要有抓取其他类型文档的能力。下面简要记录一些个人已知的基于python3的抓取方法,以备查阅。1.抓取…

.NET(C#)有哪些主流的ORM框架

前言 在以前的一篇文章中,为大家分享了《什么是ORM?为什么用ORM?浅析ORM的使用及利弊》。那么,在目前的.NET(C#)的世界里,有哪些主流的ORM,SqlSugar,Dapper,Entity Framework(EF)还…

android 加载网络bitmap图片 oom 简书_Android常见问题--ImageView加载图片OOM

开发中给ImageView加载一个高质量图片时,APP抛出了“Canvas: trying to draw too large(840253440bytes) bitmap.”的异常。猜测是图片占用内存太大,超出APP被分配的内存(我用的mate9,APP被分的内存差不多200m),造成了OOM。解决方…

.net开源框架开源类库(整理)

常用库 Json.NET https://github.com/JamesNK/Newtonsoft.Json Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单。通过Linq To JSON可以快速的读写Json,通过JsonSerializer可以序列化你的.Net对象。让你轻松实现.Net中…

docker jdk mysql_docker部署springboot前后端分离项目(jdk+jar包+mysql+redis+nginx)(示例代码)...

jdk1.8,dockerfile文件1.vim jdk-dockerfile?FROM centos:7MAINTAINER sinvie.cnWORKDIR /usrRUN mkdir /usr/local/javaADD jdk-8u221-linux-x64.tar.gz /usr/local/java/ENV JAVA_HOME /usr/local/java/jdk1.8.0_221ENV JRE_HOME $JAVA_HOME/jreENV CLASSPATH $J…

matlab连接mysql教程视频_Matlab建立到Oracle数据库的连接

Linux下的配置过程和Windows一样,如下:1、将Oracle JDBC的JAR包拷贝到Matlab的相关目录(..\matlab\java\jar\toolbox\)下。一、Matlab通过ODBC建立到Oracle数据库的连接1、在Windows下“开始”→“控制面板”→“性能和维护”→“管理工具”,…

C# App.config学习

进入公司一年多来&#xff0c;对配置文件添加了不少参数&#xff0c;但是从未想过这些参数是如何被读取出来的&#xff0c;今天把读取参数的处理看了一下&#xff0c;收获不少。假定有App.config如下 <?xml version"1.0" encoding"utf-8" ?> <…

php mysql 查询时间_PHP-MySQL查询需要大量时间才能执行

我正在开发时间表应用程序,并编写PHP代码以提取所有时间表直到日期.这是我为获取时间表而编写的查询-选择a.accnt_name,u.username,DATE_FORMAT(t.in_time,’&#xff05;H&#xff1a;&#xff05;i’)inTime,DATE_FORMAT(t.out_time,’&#xff05;H&#xff1a;&#xff05;…

大数据-----软件开发模型(详细讲解)

大数据学习免费学习资料&#xff08;免费教程&#xff09; 软件工程中&#xff0c;常用的开了模型有四种&#xff1a;瀑布模型、原型模型、增量模型和螺旋模型。 ⒈瀑布模型包括计划&#xff0c;需求分析、设计、编码、测试、运行维护六个阶段&#xff0c;阶段自上而下&#x…

python response[200_python – django上的代码200 httpresponse

我正在进行服务基本登录,我需要在Django视图中回答代码200和JSON,但我不知道这是否是使用HttpResponse库的正确形式&#xff1f;def Login(email,password):UserCUser()if User.is_valid(email,password) :userUser.find(email)datos[Id] str(user[Id])datos[Name] user[Name…

C#中struct和class的区别详解

本文详细分析了C#中struct和class的区别&#xff0c;对于C#初学者来说是有必要加以了解并掌握的。 简单来说&#xff0c;struct是值类型&#xff0c;创建一个struct类型的实例被分配在栈上。class是引用类型&#xff0c;创建一个class类型实例被分配在托管堆上。但struct和cla…