一、概念

①常见的架构方式或者开发思想还有MVC、MVP和MVVM,参考文章:MVC,MVP 和 MVVM 的图示

②MVC:视图(View),指用户界面;控制器(Controller),指业务逻辑;模型(Model),指数据保存

③MVP:将 Controller 改名为 Presenter,同时改变了通信方向

④MVVM:M,即model 业务数据模型,指操作数据的类;V,即view 视图界面,HTML用户界面;VM,viewModel 视图数据模型,指驱动视图改变的data数据。核心思想就是数据驱动视图。

二、MVVM的优点

①低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
②可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
③独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xml代码。
④可测试。界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。

三、vue原理简单剖析

  <div id="app">
{{message}}
<h1>{{message}}</h1>
</div>
<script>
function Vue(options){
var {el,data}=options;
// 根节点
var rootEl=document.querySelector(el);
var childNodes=rootEl.childNodes;
var domAndKey={ };
// 编译模板
for(var i=0;i<childNodes.length;i++){
let node=childNodes[i];
switch(node.nodeType){
case 1:
//console.log(node,'标签节点')
break
case 3:
//console.log(node,'文本节点')
var matches=/{{(.+)}}/.exec(node.textContent);
if(matches){
var dataKey=matches[1].trim();
//console.log(dataKey);
// 记住这个节点以及这个节点所绑定的数据成员
domAndKey[dataKey] = node;
}
break
default:
break
}
}
// 数据观测
for(let key in data){
Object.defineProperty(this,key,{
get(){ },
set(val){
domAndKey['message'].textContent = val
}
})
}
}
var app =new Vue({
el:'#app',
data:{
message:'hello vue'
},
});
</script>

四、双向绑定原理

①事件订阅发布模型

// 设计模式:事件发布/订阅模型
/* 构造函数 */
function EventEmit(){
this.callbacks={}
};
/* 添加原型方法 */
EventEmit.prototype.on=function(eventName,fn){
if(!this.callbacks[eventName]){
this.callbacks[eventName]=[]
}
this.callbacks[eventName].push(fn)
};
/* 添加原型方法 */
EventEmit.prototype.emit=function(eventName){
if(!this.callbacks[eventName]){
return
}
this.callbacks[eventName].forEach(fn => {
fn()
});
} //创建实例对象
var el=new EventEmit();
// 订阅事件
el.on('message',function(){
console.log('aaa')
})
el.on('message',function(){
console.log('bbb')
})
el.on('message',function(){
console.log('ccc')
})
// 发布事件
el.emit('a')

②双向绑定实现

    <div id="app">
{{message}}
<input type="text" v-model='message'>
<h1>{{message}}</h1>
<div>
<div>{{message}}</div>
<div>
<h1>{{message}}</h1>
</div>
</div>
</div>
<!-- 引入事件订阅发布模型文件 -->
<script src="eventemit.js"></script><!-- -->
<script>
//双向绑定实现原理的核心就是Object.defineProperty和事件订阅发布模型
(function(){
function Vue(options){
var {el,data}=options;
// 根节点
var rootEl=document.querySelector(el);
var _date={};
var _event=new EventEmit();
// 数据观测:当date中的数据发生变化时,发出事件通知,所有订阅了该事件的DOM都会得到更新
for(let key in data){
_date[key]=data[key];//把data中的数据往_data里复制一份,当通过 实例访问data中的数据时,实际上访问的是_data中的数据
Object.defineProperty(this,key,{
get(){
return _data[key]
},
set(val){
_date[key]=val;
_event.emit(key);
},
});
}
// 递归解析模板,注册数据绑定事件
function compile(childNodes){
childNodes.forEach((node,index) => {
switch(node.nodeType){
case 1: //处理input类型的标签
if(node.nodeName==='INPUT'){
const vModel=node.attributes['v-model'];
if(!vModel){
return
}
var dataKey=vModel.value.trim();
node.oninput=()=>{
this[dataKey]=node.value;
}
}
compile.call(this,node.childNodes);//标签节点继续递归调用
break
case 3:
var matches=/{{(.+)}}/.exec(node.textContent);
if(matches){
var dataKey=matches[1].trim();
_event.on(dataKey,()=>{
node.textContent=_date[dataKey];
})
}
break
}
});
}
compile.call(this,rootEl.childNodes)
}
window.Vue=Vue
})();
var app =new Vue({
el:'#app',
data:{
message:'hello vue',
},
});
</script>

MVVM架构方式的更多相关文章

  1. MVVM架构~目录

    回到占占推荐博客索引 MVVM在概念上是真正将页面与数据逻辑分离的模式,在开发方式上,它是真正将前台代码开发者(JS+HTML)与后台代码开发者分离的模式(asp,asp.net,php,jsp).在 ...

  2. MVVM架构~使用boxy和knockoutjs实现编辑功能

    返回目录 这个功能我认为非常有用,尤其在后台管理系统中,它对用户来说,使用体验这块非常不错,下面是它的截图

  3. ReactiveCocoa常见操作方法介绍/MVVM架构思想

      1.ReactiveCocoa常见操作方法介绍. 1.1 ReactiveCocoa操作须知 所有的信号(RACSignal)都可以进行操作处理,因为所有操作方法都定义在RACStream.h中, ...

  4. MVVM架构的一次实践,重写iOS头条客户端

    前言: 一个iOS头条APP,使用MVVM架构实现,代码中有注释,封装了AFN网络请求,解媾代码,使用起来非常方便.用最经典的TableView展示,后续不断更新,喜欢就star或fork一下,有问题 ...

  5. MVVM架构~knockoutjs系列之表单添加(验证)与列表操作源码开放

    返回目录 本文章应该是knockoutjs系列的最后一篇了,前几篇中主要讲一些基础知识,这一讲主要是一个实际的例子,对于一个对象的添加与编辑功能的实现,并将项目源代码公开了,共大家一起学习! knoc ...

  6. WPF MVVM 架构 Step By Step(6)(把actions从view model解耦)

    到现在为止,我们创建了一个简单的MVVM的例子,包含了实现了的属性和命令.我们现在有这样一个包含了例如textbox类似的输入元素的视图,textbox用绑定来和view model联系,像点击but ...

  7. [转]MVVM架构~mvc,mvp,mvvm大话开篇

    MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一 ...

  8. [Vue入门及介绍,基础使用、MVVM架构、插值表达式、文本指令、事件指令]

    [Vue入门及介绍,基础使用.MVVM架构.插值表达式.文本指令.事件指令] 1)定义:javascript渐进式框架 ​ 渐进式:可以控制一个页面的一个标签,也可以控制一系列标签,也可以控制整个页面 ...

  9. MVVM架构~Knockoutjs系列之验证机制的引入

    返回目录 对于Knockoutjs本身来说,没有提供验证模块,不过,有第三方的扩展,就像你为jquery库作extensions一样,这讲中我将介绍一个Knockout插件扩展,knockout.va ...

随机推荐

  1. 推荐一个GOLANG入门很好的网址

    推荐一个GOLANG入门很好的网址,栗子很全 https://books.studygolang.com/gobyexample/

  2. 总结:WPF中MultiBinding多值绑定的方法

    原文:总结:WPF中MultiBinding多值绑定的方法 一.Xaml中绑定代码: <TextBlock  Grid.Row="5" Grid.Column="3 ...

  3. List泛型用法(转载)

    网上的List泛型用法,未验证,目测基本正确,教学用资料. 1.  List的基础.常用方法: 声明: 1.List<T> mList = new List<T>(); T为列 ...

  4. systemd - CentOS 7进程守护&监控

    需求: 运行环境为CentOS 7系统,我们开发了一个程序,需要在开机时启动它,当程序进程crash或者开机之后,守护进程立即拉起进程. 解决方案: 使用CentOS 7中的init进程systemd ...

  5. C# zip压缩 Ionic.Zip.dll

    #region Ionic.Zip压缩文件 //压缩方法一 public void ExeCompOne() { string FileName = DateTime.Now.ToString(&qu ...

  6. witchcase

    #include "stdafx.h" #include using namespace std; int _tmain(int argc, _TCHAR* argv[]) { i ...

  7. drf之接口规范

    web接口 # 请求工具:postman => https://www.getpostman.com/ # 接口:url链接,通过向链接发生不同的类型请求与数据得到相应的响应数据 # http: ...

  8. Java 8 in Action

    https://www.cnblogs.com/HelloDeveloper/p/11404523.html /** * @param args */public static void main(S ...

  9. Java 之 线程 —线程通信( 等待唤醒机制)

    一.线程间通信 概念:多个线程在处理同一资源,但是处理的动作(线程的任务)却不相同. 例如: 线程 A 用来生成包子的,线程 B 用来吃包子的,包子可以理解为同一资源,线程 A 与线程 B 处理的动作 ...

  10. JavaScript 变量与注释

    一.变量 ECMAScript 的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据. 换句话说,每个变量仅仅是一个用于保存值的占位符而已.定义变量时要使用 var 操作符(注意 var 是 ...