阅读目录

  • 简而言之
  • 组成部分
  • 没有什么是一个栗子不能解决的

简而言之

之前对 MVVM 模式一直只是模模糊糊的认识,正所谓没有实践就没有发言权,通过这两年对 Vue 框架的深入学习和项目实践,终于可以装B了有了拨开云雾见月明的感觉。

Model–View–ViewModel(MVVM) 是一个软件架构设计模式,由微软 WPF 和 Silverlight 的架构师 Ken Cooper 和 Ted Peters 开发,是一种简化用户界面的事件驱动编程方式。由 John Gossman(同样也是 WPF 和 Silverlight 的架构师)于2005年在他的博客上发表。

MVVM 源自于经典的 Model–View–Controller(MVC)模式(期间还演化出了 Model-View-Presenter(MVP)模式,可忽略不计)。MVVM 的出现促进了 GUI 前端开发与后端业务逻辑的分离,极大地提高了前端开发效率。MVVM 的核心是 ViewModel 层,它就像是一个中转站(value converter),负责转换 Model 中的数据对象来让数据变得更容易管理和使用,该层向上与视图层进行双向数据绑定,向下与 Model 层通过接口请求进行数据交互,起呈上启下作用。如下图所示:

MVVM模式

MVVM 已经相当成熟了,主要运用但不仅仅在网络应用程序开发中。KnockoutJS 是最早实现 MVVM 模式的前端框架之一,当下流行的 MVVM 框架有 Vue,Angular 等。

组成部分

简单画了一张图来说明 MVVM 的各个组成部分:

MVVM分层示意图

分层设计一直是软件架构的主流设计思想之一,MVVM 也不例外。

# View 层

View 是视图层,也就是用户界面。前端主要由 HTML 和 CSS 来构建,为了更方便地展现 ViewModel 或者 Model 层的数据,已经产生了各种各样的前后端模板语言,比如 FreeMarker、Marko、Pug、Jinja2等等,各大 MVVM 框架如 KnockoutJS,Vue,Angular 等也都有自己用来构建用户界面的内置模板语言。

# Model 层

Model 是指数据模型,泛指后端进行的各种业务逻辑处理和数据操控,主要围绕数据库系统展开。后端的处理通常会非常复杂:

前后端对比

后端:我们这里的业务逻辑和数据处理会非常复杂!
前端:关我屁事!

后端业务处理再复杂跟我们前端也没有半毛钱关系,只要后端保证对外接口足够简单就行了,我请求api,你把数据返出来,咱俩就这点关系,其他都扯淡。

# ViewModel 层

ViewModel 是由前端开发人员组织生成和维护的视图数据层。在这一层,前端开发者对从后端获取的 Model 数据进行转换处理,做二次封装,以生成符合 View 层使用预期的视图数据模型。需要注意的是 ViewModel 所封装出来的数据模型包括视图的状态和行为两部分,而 Model 层的数据模型是只包含状态的,比如页面的这一块展示什么,那一块展示什么这些都属于视图状态(展示),而页面加载进来时发生什么,点击这一块发生什么,这一块滚动时发生什么这些都属于视图行为(交互),视图状态和行为都封装在了 ViewModel 里。这样的封装使得 ViewModel 可以完整地去描述 View 层。由于实现了双向绑定,ViewModel 的内容会实时展现在 View 层,这是激动人心的,因为前端开发者再也不必低效又麻烦地通过操纵 DOM 去更新视图,MVVM 框架已经把最脏最累的一块做好了,我们开发者只需要处理和维护 ViewModel,更新数据视图就会自动得到相应更新,真正实现数据驱动开发。看到了吧,View 层展现的不是 Model 层的数据,而是 ViewModel 的数据,由 ViewModel 负责与 Model 层交互,这就完全解耦了 View 层和 Model 层,这个解耦是至关重要的,它是前后端分离方案实施的重要一环。

没有什么是一个栗子不能解决的

扯了这么多,并没有什么卵用。千言万语不如一个栗子来的干脆,下面用一个 Vue 实例来说明 MVVM 的具体表现。

Vue 的 View 模板:

<div id="app"><p>{{message}}</p><button v-on:click="showMessage()">Click me</button>
</div>

Vue 的 ViewModel 层(下面是伪代码):

var app = new Vue({el: '#app',data: {     // 用于描述视图状态(有基于 Model 层数据定义的,也有纯前端定义)message: 'Hello Vue!',  // 纯前端定义server: {}, // 存放基于 Model 层数据的二次封装数据},methods: {  // 用于描述视图行为(完全前端定义)showMessage(){let vm = this;alert(vm.message);}},created(){let vm = this;// Ajax 获取 Model 层的数据ajax({url: '/your/server/data/api',success(res){// TODO 对获取到的 Model 数据进行转换处理,做二次封装vm.server = res;}});}
})

服务端的 Model 层(省略业务逻辑处理,只描述对外接口):

{"url": "/your/server/data/api","res": {"success": true,"name": "IoveC","domain": "www.cnblogs.com"}
}

这就是完整的 MVVM 编程模式。

代码执行之后双向绑定的效果如下:

Vue实现的响应的数据绑定

嘿嘿,前后端可以成功分手了,以后再也不用关心后端个锤子开发进度\暴怒脸,复杂实现,blabla...,尽情享用前端如丝般顺滑的开发快

前后端分离——MVVM 模式相关推荐

  1. 前后端分离开发模式下后端质量的保证 —— 单元测试

    概述 在今天, 前后端分离已经是首选的一个开发模式.这对于后端团队来说其实是一个好消息,减轻任务并且更专注.在测试方面,就更加依赖于单元测试对于API以及后端业务逻辑的较验.当然单元测试并非在前后端分 ...

  2. ultraedit 运行的是试用模式_单元测试 —— 前后端分离开发模式下后端质量的保证...

    概述 在今天, 前后端分离已经是首选的一个开发模式.这对于后端团队来说其实是一个好消息,减轻任务并且更专注.在测试方面,就更加依赖于单元测试对于API以及后端业务逻辑的较验.当然单元测试并非在前后端分 ...

  3. 前后端混合开发模式和前后端分离开发模式

    前后端混合开发模式和前后端分离开发模式 一.前后端混合开发模式 二.前后端分离开发模式

  4. Nodejs搭建前后端分离开发模式下的微信网页项目

    原文链接:<Nodejs搭建前后端分离开发模式下的微信网页项目>- 陈帅华 本文涉及对前后端分离及微信网页项目中的前端如何在本地环境中开发与调试的思考. 主要问题 1.如何配置微信公众平台 ...

  5. 前后端分手大师——MVVM 模式

    阅读目录 简而言之 组成部分 没有什么是一个栗子不能解决的 简而言之 之前对 MVVM 模式一直只是模模糊糊的认识,正所谓没有实践就没有发言权,通过这两年对 Vue 框架的深入学习和项目实践,终于可以 ...

  6. 前后端分离开发模式介绍

    1.1 什么是前后端分离 前后端分离是目前一种非常流行的开发模式,它使项目的分工更加明确: 后端:负责处理.存储数据 前端:负责显示数据 前端和后端开发人员通过 接口 进行数据的交换. 1.2 为什么 ...

  7. [前后端分离][MVC模式]JavaWeb实现简单的购物网站主体功能

    本次购物网站小项目涉及的主体功能如下: 1.商品信息显示 2.详细商品信息显示 3.浏览过的商品信息列表(以五条为轮换) 4.购物车信息的增删改查 下面将展示最终结果,描述整体设计逻辑,并解释部分重要 ...

  8. 单realm模式下前后端分离实现springboot+shiro+jwt+vue整合

    shiro+jwt实现前后端分离 一.RBAC概念 基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注.在R ...

  9. Node — 第六天(前后端分离)及(身份验证)

    综合应用服务端知识点搭建项目 下载安装所需的第三方模块 npm init -y npm i express cors mysql # express 用于搭建服务器 # cors 用于解决跨域 # m ...

最新文章

  1. C语言的链表—完整代码
  2. java中飞飞检查异常_Java复习6异常处理
  3. 运维企业专题(2)HTTP加速器——Varnish缓存机制后篇(后端服务器集群、负载均衡与CDN推送平台搭建)
  4. 【高级Java架构师系统学习】java问答社区系统
  5. 16行代码AC——紫书| 例题7-3 Fractions Again?! (UVA - 10976)_时间复杂度O(n)
  6. 学习Android MediaPlayer
  7. excel列显示形式互换(字母与数字)
  8. 只做macd二次金叉_【教你一招】MACD低位二次金叉
  9. mysql存储ip地址_MySQL怎样存储IP地址
  10. ASP.NET 2.0 – 如何巢状化GridView控件 (转自章立民CnBlogs)
  11. 写个类操作窗口(句柄操作)
  12. Mybatis-SpringBoot集成/配置
  13. 如何更好地控制input输入框的高度
  14. 勒索病毒“永恒之蓝”变种再来,该如何关闭445端口(收藏)
  15. navicat的注册码
  16. c语言设计一个酒店管理系统,C语言酒店管理系统设计.docx
  17. Java ques:java.lang.NoClassDefFoundError: org/junit/platform/engine/ConfigurationParameters
  18. Python MD5值破解
  19. 高并发高可用高可靠性的千人千面项目技术架构分析
  20. java对接paypal支付应用实例 (v2)

热门文章

  1. html表格单元格边框合并
  2. 2020那些搭载Imagination IP的设备(国内篇)
  3. 框架体系——SpringIOC
  4. 金蝶服务器怎么部署应用,金蝶应用服务器的装配部署
  5. 【FreeMind】简介信息
  6. 想快速下载P站画作但不会爬虫怎么办?我帮你搞了个exe。。。
  7. PHPCMS_数据库配置
  8. 同城婚恋相亲交友系统源码开源版婚姻介绍红娘分销平台源码盲盒交友多种认证可封装APP
  9. Windows下安装MySQL数据库
  10. 微信开发-服务器接入配置