框架与库的最大区别就是代码的风格确认,库只是页面级别的选择,而架构则关注于整个程序的设计

MVC

  作为软件中的99口诀,软件设计要是没个mvc就好像不是正规军一样,前端也是这样,将html理解为view,js理解为controller,js的通讯(主要指ajax)交互理解为model的获取,那么前端就是一个标准的mvc架构,其写法大致是这样的

html/view:

 <button class="btn btn-info" id='save'>提交</button>

js/controller:

    $('#save').click(function() {$.post('/api/save').done(function(res) {consoel.log(res);}).fail(function(error) {consoel.log(error);})});

ajax就是与model的交互

值得注意的是浏览器是基于事件触发的,一切响应都基于事件,与我们自定义的函数最大的区别就是其第一个参数一定为event,所以也就可以明确的表明js通过选择器进行事件的赋值,以达到控制的目的,so...作为一个前端理解为mvc的架构师,就需要对其写法进行简单的确定,比如:

js/controller-->更明确的controller结构

(function(){//初始化//将事件业务描述化function save(event){}$.controller.a={'#save':{click:save}}
})()

$.controller为所有的控制器,其中的a就是改页面的controller的内容,而后在结合简单的架构封装,比如路由或者在html上增加加载选项,就可以让这个js作用于当前的view,当然这种写法是用来描述的,在js加载器不断完善,已融入为架构的一部分的情况下,controller早就可以更加的对象化,比如这样:

define(function(require, exports, module) {//初始化参数
module.exports = {'#save':{click:save}}//事件业务化function save(event) {//....
    }})

看着很熟悉吧,没错,用了seajs,加载器是架构的一部分,程序的设计就是api的设计(无视如何掉用的地方),单说这样的写法是不是让人感觉更加的mvc呢?

总之,前端的mvc大致就是将html看作view,一切与view无关的事情通通忽略(根据架构,可能会有1~2行的代码用以描述controller),将js看作controller,其通过选择器(即mvc中的接口)的方式获取view并进行操作,并通过ajax与后台(model)进行交互(M的概念一致比较弱化),以此达到解耦的目的

当然前端mvc包含mvc的所有缺点(依赖接口,更多的是接口太多,甚至无法固定接口),尤其在前端这种特殊的业务环境下,在其业务描述必定基于事件(这在前端肯定避免不了)的前提下,相似的业务总会让人措手不及,controller的描述也就变的无比蛋疼...

mvvm

  解决问题的办法永远都是分层,mvvm也是一样,将基于事件的驱动,修正为基于方法,甚至基于属性,就是一个更好的方式,mvvm的控制器并不会去监听浏览器的事件,而是监听一个属性表,由浏览器的事件修改属性,以触发控制器中的方法,增加了一层控制业务的属性,而这层属性被称为vm

举个栗子:

假设一个分页的业务,在两种架构中m和v都一样,则:

define(function(require, exports, module) {//初始化参数var page=1,totalpage=10;module.exports = {'#pre':{click:pre},'#next':{click:next},'#last':{click:last},'#first':{click:first}}//事件业务化function pre(event) {page=(page===1)?1:page-1;exec();}function next(event){page=(page===totalpage)?totalpage:page+1;exec();}//...last,first//总会有大量的通用业务,比如这个function exec(){$.ajax('/api/users',{page:page,})}})

依赖于属性的变化,so...

define(function(require, exports, module) {//初始化参数var page=1,totalpage=10;module.exports = {'#pre':{click:pre},'#next':{click:next},'#last':{click:last},'#first':{click:first}}//事件业务化function pre(event) {page=(page===1)?1:page-1;}function next(event){page=(page===totalpage)?totalpage:page+1;}//...last,first//真正的业务,需要监控page属性$.watch('page',function(newv,oldv){$.ajax('/api/users',{page:page})});
})

无视$.watch的存在,至少我们知道那里面包含的就是真正的业务逻辑,而所谓的事件,都只是用来修改属性的对吧,就目前来讲,他跟mvc还是很像,如果感觉到mvvm中的事件都只是修改属性的特点的化,结合dom赋值的特点,在view中通过onclick属性修改属性标签的化,就能够将所有的接口(选择器)全部的干掉...换而研制,依赖vm的变化,而非事件的变化,将业务的重点至于方法中而非事件中

如果了解js,html,css分离肯能会感觉到,在html中写onclik是不是太耦合了...没错,单说耦合的话的确是这样,但在前端大多数场景中,这种耦合是有必要的(尼玛都是一个人写,又不像前后端分离那样明显),这种耦合可以消灭所有的接口建立,也就是所谓了无选择器和自动执行的特点

mvp

mvc,mvp,mvvm进场在一起比较的三胞胎,前端似乎不流行mvp-。-

假设mvc是基础,基于vc的强化叫mvvm,那基于vm的强化就叫mvp,model的获取是通过ajax,前端根model已无法在进行太多的封装(在整就到后台了),so...好像还是没有解释mvp-。-

mvp大致就是充血模式吧,就酱紫

  当然了,前端mvc和mvvm是各位大神根据实践一步步总结出来的,而非想像上面简单的分析出来的,这里只是架构风格和业务写法上做的简单分析,更重要的区别还是要给予实践才能感受到,任何架构都有适用的范围,百数内的排序还是快排好,买名牌还是实体店放心,万能架构还是算了吧

转载于:https://www.cnblogs.com/liuCy/p/4947642.html

前端mvc与mvvm相关推荐

  1. 前端MVC/MVP/MVVM示例

    目录 MVC index.html Container.js Modal.js View.js 说点啥 MVP index.html BaseView.js View.js Presenter.js ...

  2. java三层架构,表示层MVC,和前端视图层mvvm

    1.三层架构 Java的三层架构分别为表示层.业务逻辑层和数据持久层. 表示层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得. 业务逻辑层(BLL):针对具体问题的操作, ...

  3. 架构模式:MVC与MVVM

    本文探讨如下几个问题: 什么是MVC 什么是MVVM MVC与MVVM对架构属性的影响 MVC实例SpringMVC MVVM实例Vue MVC.MVVM与Layer中的Model,Controlle ...

  4. 探索从 MVC 到 MVVM + Flux 架构模式的转变

    在业务中一般 MVVM 框架一般都会配合上数据状态库(redux, mobx 等)一起使用,本文会通过一个小 demo 来讲述为什么会引人数据状态库. 从 MVC 到 MVVM 模式说起 传统 MVC ...

  5. 第四十五课:MVC,MVP,MVVM的区别

    前端架构从MVC到MVP,再到MVVM,它们都有不同的应用场景.但MVVM已经被证实为界面开发最好的方案了. MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/P ...

  6. 什么是Vue.js?||为什么要学习流行框架||框架和库的区别?||MVC和MVVM的关系图解

    什么是Vue.js? Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App, Vue语法也是可以用于进行手机App开发的,需要借助于W ...

  7. java mvc mvp mvvm_一篇文章了解架构模式:MVC/MVP/MVVM

    架构模式的文章很多,好理解的没有几个.大部分文章出现的主要问题有: 没有设定好作用域:前端MVC是改造过的MVC,和后台MVC有明显的区别,不能一概而论 没有实际的例子:实际的例子对应日常的工作,没有 ...

  8. MVC和MVVM框架介绍

    一.MVC框架(后端的分层开发概念): MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业 ...

  9. MVC和MVVM有什么区别

    一.MVC: MVC是后端的分层开发概念.其中: M:model,模型层.代表数据库中的数据源. V:view,视图层.代表能看到的客户端页面,是根据模型数据创建的. C:controller,控制层 ...

最新文章

  1. linux_kernel下载网站
  2. 对采用rsync+inotify数据同步方式进行健康检测
  3. 【频谱共享】基于认知无线电的VCG拍卖机制频谱共享算法的MATLAB仿真
  4. excel模糊匹配两列文字_Excel快速画出美观饼图
  5. 阿里启动NASA计划创造新经济核心科技
  6. python高级功能_python高级篇
  7. html怎样设置图片的位置不变,CSS 如何定位图片保持位置不变?
  8. chrome浏览器加载css、js等静态资源文件的坑
  9. 数据库课程设计——实验报告管理系统(超详细)
  10. QT界面窗口的显示和隐藏,关闭
  11. 大学计算机基础案例教程章测试答案,大学计算机基础案例教程--Win7+Office2010(高等院校公共基础课规划教材)...
  12. 【Docker】No defult Boot2Docer ISO异常
  13. (十)打包和项目部署
  14. OpenNLP ngram n元语法模型(简介)
  15. android 开发过程中涉及到的清除缓存操作
  16. linux内核函数出错的返回值
  17. 与构架有关的几个基本概念
  18. ES6中Set方法实现数组去重
  19. kruskal java_Kruskal算法(三)之 Java详解
  20. iOS13.7 各机型续航对比测试,更省电了吗?

热门文章

  1. python Multiprocessing Pool 应用
  2. Python datatime date
  3. Java JDBC Druid
  4. 1.12 深层循环神经网络
  5. python 顺序表
  6. 支付业务与技术架构学习总结(6)——对账系统的设计
  7. html flex 表单样式,Flexbox 布局的最简单表单的实现
  8. 高级网络配置:Bond网络接口、Team网络接口和网桥
  9. oracle date 隐式转换,PL/SQL中的数据类型隐式转换规则
  10. stm32数据手册boot_STM32问题集之BOOT0和BOOT1的作用