MVVM解析
闲来无事看到了一个关于Vue的MVVM的简单讲解,觉得写得不错,做个分享。
文章地址
文章内容我就不贴出,比较简洁明了,我记录一下我的一些思考总结。
PS:建议先仔细读这篇文章。
MVVM
MVVM即双向数据绑定,是一种设计模式,一般是Web前端框架的核心概念,肯定也不是Vue只此一家有。
简单来说就是,数据跟视图的实时绑定。如果我们自己要实现这个需求,那核心的问题有三个:
1、如何监听到数据变化?
2、数据变化如何通知到视图?
3、视图如何更新?
这三个问题先放着,后面大家就知道我为什么这么划分这三个问题。
讨论文章
实现数据绑定的做法有大致如下几种:1、发布者-订阅者模式(backbone.js)2、脏值检查(angular.js)3、数据劫持(vue.js)
那文章中把实现数据绑定归类为这几种,不过我觉得他的说法有问题。
首先,发布订阅模式是一种消息通知的设计模式,它解决的是通知的问题,也就是我上面提到的第2个问题。
然后,无论是脏值检查还是数据劫持,它解决的是监听数据变化的问题,也即是上面第1个问题。
也就是说,实现数据绑定,做法是 2 或 3 + 1,而不是选择其中一个就可以的。
另外,这三个方式并没有视图更新的部分,不能算是一个完整的数据绑定过程。
PS:这一点上大家要明确。
如何监听到数据变化?
angular.js:脏值检查。
vue.js:数据劫持。
angular.js我已许久不用,就不多讨论,这里谈谈vue.js。
不得不说,vue.js是做得比较鸡贼的,它利用js的语言特性,即Object.defineProperty()方法,做到了监听数据变化,但也因此它只能兼容IE9以上浏览器。

框架所使用的语言特性,直接影响它的兼容性。
数据变化如何通知到视图?
如果对设计模式比较了解,一看到这个需求,很自然而然地就想起订阅发布模式。
关于订阅发布模式,可查看:https://www.cnblogs.com/lovesong/p/5272752.html
视图如何更新?
在看那文章中,我最感兴趣的是这个,有些豁然开朗。
在我看来,视图更新数据无非是在元素节点的属性或内容上,那么只需要设置一些特殊的指令作识别,再将相应的数据更新到元素上即可。
这样这一步需要做两件事:
1、指令解析器。解析指令,例如指令类型、对应表达式或数据项。
2、订阅事件。根据数据项生成订阅者。
做到这两步,再加上前面所做,就完成了MV的绑定。这个过程中,数据的维护方是观察者,而指令解析器是订阅者。
可能大家没有意识到的是,如果要完成VM的绑定,那么指令解析器是观察者,而数据的维护方是订阅者。例如一个表单的input,指令解析器解析出v-model时,它就需要监听input的change事件,当数值变化时,它需要通知数据维护方更新数据。
所以,在完整的MVVM中,数据维护方和指令解析器即是观察者,也是订阅者。
总结
MVVM,无论细节是如何实现,其关键部分就在于订阅发布这种思想,把握好这个,理解就不难了。
MVVM解析的更多相关文章
- MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...
- MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信
MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...
- MVVM模式解析和在WPF中的实现(三)命令绑定
MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- 前端Mvvm QC 设计解析
QC 官网http://time-go.github.io/qc/ QC的具体用法.介绍和源码,大家可以去官网下载 从本节开始,我会和大家一起分享在这个框架设计中用到的技巧,希望这些技巧能个大家带来灵 ...
- MVVM 框架解析之双向绑定
更好的阅读体验,点击 原文地址 MVVM 框架 近年来前端一个明显的开发趋势就是架构从传统的 MVC 模式向 MVVM 模式迁移.在传统的 MVC 下,当前前端和后端发生数据交互后会刷新整个页面,从而 ...
- 手动实现一个vue的mvvm,思路解析
1.解析dom.fragment编译,初始化new watcher 2 ,数据劫持,Object.defineProperty(obj,key,{ configurable:true,// 可以配置 ...
- 对Vue中的MVVM原理解析和实现
对Vue中的MVVM原理解析和实现 首先你对Vue需要有一定的了解,知道MVVM.这样才能更有助于你顺利的完成下面原理的阅读学习和编写 下面由我阿巴阿巴的详细走一遍Vue中MVVM原理的实现,这篇文章 ...
- mvvm架构使用解析
配置 android studio目前已经集成了dataBinding,只需在build.gradle中配置,如下: android { dataBinding { enabled = true; } ...
- MVVM框架解析(一)
花了一点时间看了一下微软开源MVVM代码,受义很多! 从代码整体上看,代码分为四大类, 从图中看不能明白我要表达的意思.显而意见!MainApplicationWindow.xaml是应用程序主窗口( ...
随机推荐
- 了解 MongoDB 看这一篇就够了【华为云分享】
目录 一.简介 二.基本模型 BSON 数据类型 分布式ID 三.操作语法 四.索引 索引特性 索引分类 索引评估.调优 五.集群 分片机制 副本集 六.事务与一致性 一致性 小结 一.简介 Mong ...
- Gradle+Groovy提高篇
创建自定义任务 打开build.gradle文件,并在末尾添加以下内容: println "1" task howdy { println "2" doLast ...
- 2017 CCPC秦皇岛 E题 String of CCPC
BaoBao has just found a string of length consisting of 'C' and 'P' in his pocket. As a big fan of ...
- 2018HDU多校训练-3-Problem F. Grab The Tree
Little Q and Little T are playing a game on a tree. There are n vertices on the tree, labeled by 1,2 ...
- CSU oj 2092-Space Golf
You surely have never heard of this new planet surface exploration scheme, as it is being carried ou ...
- ARTS-S docker ceontos镜像中使用crontab
centos镜像中默认没有crontab,需要在dockerflle中通过yum的安装 yum -y install vixie-cron crontabs && yum clean ...
- Asp.net Core 异常日志与API返回值处理
需求: 1.对异常进行捕获记录日志 并且修改返回值给前端 解释: ILogger4是自定义的一个日志,更改它就好 解决方案1: 使用中间件进行异常捕获并且修改其返回值 public class Err ...
- Selenium之单选框操作
单选框操作: 何为单选框?就是永远只能选中一个选项的意思.一般单选框的图标都是呈圆形的.我们通过selenium可直接定位到被选中的选项上,然后用click方法实现点击. 下面附上一段rb.html代 ...
- 正则去掉html标签之间的空格、换行符、tab符,但是保留html标签内部的属性空格
今天遇到一个比较少见的去空格: 正则去掉html标签之间的空格.换行符.tab符,但是保留html标签内部的属性空格 JS 举例: "<a href='baidu.com' name= ...
- 基于icamera usb2.0的视频采集系统之mt9m001c12stc测评
基于usb2.0的视频采集系统之mt9m001c12stc测评 因为该sensor不带isp,所以不支持白平衡,默认图像彩色颜色会和实际偏离,演示如下 颜色偏绿,所以降低该通道的增益,或者提供其他通道 ...