【转】React Vue MVC MVVM MVP

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

我们先来看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/439314.shtml

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

相关文章

**【POJ - 3122】 Pie(二分寻值)

题干: My birthday is coming up and traditionally Im serving pie. Not just one pie, no, I have a number N of them, of various tastes and of various sizes. F of my friends are coming to my party and each of them gets a piece of pie. This should b…

【转】IsCallBack属性和IsPostBack属性有什么区别?

if (Page.IsCallback) return; 此句话在page的构造函数中使用,不让page反复生成。比如一个TEXTbox如果不组织页面刷新,其数据会丢失。 以postback方式进行客户端和服务器端的交互的, IsPostBack就是true。 以callback方式进行客户端和服务器…

【转】使用Feature导入WebPart

原文链接:http://www.cnblogs.com/glife/archive/2009/10/27/1590488.html 前些天在刚刚接触WebPart的时候,搜到了一篇《使用Feature导入WebPart》的文章,那个时候对Feature的了解还为零,所以看了是一知半解,等到今天…

【HDU - 5017】Ellipsoid(爬山算法,模拟退火,三分)

题干: Given a 3-dimension ellipsoid(椭球面) your task is to find the minimal distance between the original point (0,0,0) and points on the ellipsoid. The distance between two points (x 1,y 1,z 1) and (x 2,y 2,z 2) is defined as Input There a…

【转】[SharePoint 开发详解] 一个Feature中使用SPGridView的几个Tips

根据上面一篇随笔所介绍的PC购买流程的项目,在项目中,需要有一个生成订单的功能,能够使得Admin很方便的在获得批准的申请中选取一些来生成订单,要求界面操作简单明了,大概的效果图如下: 点击checkbox&#…

【LeetCode - 131】分割回文串(dp,dfs)

题目链接:https://leetcode-cn.com/problems/palindrome-partitioning/ 题目: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。 返回 s 所有可能的分割方案。 示例: 输入: "aab" 输出: [ ["a…

【转】VSTS中版本控制系统Git与TFVC的区别

VSTS(Visual Studio Team Services) VSTS简单说就是微软TFS(Team Foundation Services)的升级云版,不用像TFS需要在企业内部服务器上部署,并且是免费提供给用户使用的。 每个有微软账号(也是免费注册的)的…

【LeetCode - 1254】统计封闭岛屿的数目(dfs,连通块)

题目链接:https://leetcode-cn.com/problems/number-of-closed-islands/ 有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 )。 我们从一块陆地出发,每次可以往上下左…

【转】0.SharePoint服务器端对象模型 之 序言

对于刚刚开始接触SharePoint的开发人员,即使之前有较为丰富的ASP.NET开发经验,在面对SharePoint时候可能也很难找到入手的方向。对于任何一种开发平台而言,学习开发的过程大致会包括:开发工具的使用、开发手段的选择和开发语言的编…

【LeetCode - 122】买卖股票的最佳时机 II(贪心 或 dp)

题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/ 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票…

【转】1.SharePoint服务器端对象模型 之 对象模型概述(Part 1)

在一个传统的ASP.NET开发过程中,我们往往会把开发分为界面展现层、逻辑业务层和数据访问层这三个层面。作为一个应用开发平台,SharePoint是微软在直观的开发能力和自由的扩展能力之间,取到的一个平衡点,其对象模型的设计理念也反映…

【LeetCode - 123】买卖股票的最佳时机 III

题目链接: 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票&#xf…

【转】1.2SharePoint服务器端对象模型 之 对象模型概述(Part 2)

(三)Url 作为一个B/S体系,在SharePoint的属性、方法参数和返回值中,大量的涉及到了Url,总的来说,涉及到的Url可以分为如下四类: 绝对路径:完整的Url,包含了协议头&…

【LeetCode - 224】基本计算器(栈)

实现一个基本的计算器来计算一个简单的字符串表达式 s 的值。 题目链接:https://leetcode-cn.com/problems/basic-calculator/ 示例 1: 输入:s "1 1" 输出:2 示例 2: 输入:s " 2-1 …

【转】2.1 SharePoint服务器端对象模型 之 访问网站和列表数据(Part 1)

本节将会介绍SharePoint中最为常用的一些对象模型,以及如何使用这些对象模型来访问和操作网站中的数据。几乎所有的SharePoint服务器端开发都会涉及到这些内容,因此应着重掌握本节中所介绍的基本对象模型的使用方法。由于篇幅所限,在介绍每种…

【LeetCode - 1047】删除字符串中的所有相邻重复项(栈)

https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/ 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复…

【转】2.2 SharePoint服务器端对象模型 之 访问网站和列表数据(Part 2)

(二)列表(SPList) 列表是SharePoint中最为重要的数据容器,我们一般保存在SharePoint中的所有数据,都是保存在列表中(文档库也是一种列表),因此列表对象在SharePoint的开…

【LeetCode - 227】基本计算器 II(栈)

https://leetcode-cn.com/problems/basic-calculator-ii/ 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 示例 1: 输入:s "32*2" 输出:7 示例 2: 输入…

Team Foundation Server的回滚操作

VSTF Rollback 操作 最近遇到要把有些项目需要做回滚操作,发现TFS的UI上没有回滚的操作。 经过百度,查到一个CSDN上的博主发了一种方法,经过验证,那种方法是错误的: 他通过先获取指定变更集-》签出-》签回去&#xff…

【LeetCode - 141142】环形链表(i和ii)(快慢指针,链表)

https://leetcode-cn.com/problems/linked-list-cycle/ 给定一个链表,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾…