一、概念

①常见的架构方式或者开发思想还有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. 「UNR#2」黎明前的巧克力

    「UNR#2」黎明前的巧克力 解题思路 考虑一个子集 \(S\) 的异或和如果为 \(0\) 那么贡献为 \(2^{|S|}\) ,不难列出生产函数的式子,这里的卷积是异或卷积. \[ [x^0]\p ...

  2. Java学习:线程的安全问题

    线程的安全问题 模拟卖票案例创建三个的线程,同时开启,对共享的票进行出售 public class RunnableImpl implementsc Runnable{ //定义一个多线程共享的票源 ...

  3. go ---作用域及判断变量类型的方式。

    package main import ( "fmt" ) var v = "1, 2, 3" func main() { v := []int{1, 2, 3 ...

  4. Xgboost GPU配置

    眼残cmake版本配错了搞了半天,简单记录一下,老规矩,参考一下官方的文档. git clone --recursive https://github.com/dmlc/xgboost cd xgbo ...

  5. LaTeX转义特殊符号

    转义字符在LaTeX中有一些符号被用于特殊的用途,如 \\      \backslash\ 符号被用于命令的转义,直接在LaTeX中输入这些符号是无法正确得到这些符号的,甚至会引起LaTeX的报错. ...

  6. springboot WebMvcConfigurer配置静态资源和解决跨域

    前言 虽然现在都流行前后端分离部署,但有时候还是需要把前端文件跟后端文件一起打包发布,这就涉及到了springboot的静态资源访问的问题.不单只是静态资源打包,比如使用本地某个目录作为文件存储,也可 ...

  7. k8s+jenkins(DevOps全流程)

    k8s集群搭建是参照别人的,链接找不到了.需要5台机器,3主2从,主最少搭建3台才能实现高可用. 流程jenkins打包代码 >> 把打包代码生成镜像 >> 备份镜像库旧镜像 ...

  8. 【转载】华为荣耀V9的手机录屏功能如何开启

    手机录屏有时候对我们的帮助很大,例如可以录制相应的APP使用教程.微信小程序使用流量讲解视频等,针对于软件开发人员等来说,手机录屏功能针对功能演示视频非常的有帮助.在华为荣耀V9手机中,进行手机录屏有 ...

  9. hibernate Criteria中多个or和and的用法 and ( or or)

    /s筛选去除无效数据 /*      detachedCriteria.add( Restrictions.or( Restrictions.like("chanpin", &qu ...

  10. Cheat Engine 字节数组类型

    BIG5 编码:http://www.qqxiuzi.cn/zh/hanzi-big5-bianma.php 打开游戏 准备修改名字 查找BIG5码 藤 吉 开始扫描 使用字节数组类型扫描 新BIG5 ...