撸一个简单的MVVM例子
我个人以为mvvm框架里面最重要的一点就是VM这部分,它要与Model层建立联系,将Model层转换成可以被View层识别的数据结构;其次也要同View建立联系,将数据及时更新到View层上,并且响应View对数据的更改,同步到Model层。
MVVM的具体例子,可以看一下阮一峰老师的这篇博客。
我们提取其中比较关键的点:
- Model层存储数据
- 需要一个View-Model来对数据做中转,响应数据变化,同步到两端
- View层来负责展示数据,接受用户事件
Model层,我们用一个对象来代表。例如:
let data = {
text: 'foo'
};
View层对于我们而言,可以认为是DOM节点。例如:
<div id="app">
<p>text</p>
</div>
为了方便注入内容,改用JS来写,可以写成
let str = `<div id="app"><p>test</p></div>`;
至于View-Model,我们要做两件事,一是将数据及时同步到View层,二是响应用户事件,更改数据。我们设计一个函数来完成这项工作。
// 把对象转成可监听的
const ob = function (data) {
// 无new构造
if (!(this instanceof ob)) {
return new ob(data);
}
// 设定观察者列表
let observerList = [];
// 暴露添加观察者方法
this.addOb = function (fn) {
observerList.push(fn);
}
// 遍历属性,通过defineProperty来对属性变化做监听
for (let key in data) {
let value = data[key];
Object.defineProperty(data, key, {
enumerable:true, // 枚举
get () {
return value;
},
set (newVal) {
value = newVal;
observerList.forEach((el)=>{
el(newVal);
})
}
})
}
};
为了简单起见,把View的渲染封装成一个函数,当然实际上不能这么操作。
const render = (text) => {
document.getElementById('app').innerHTML = '<p>'+ text +'</p>';
}
然后将render和数据绑定起来。
let testObj = {
name: 'liu'
};
const vm = (data) => {
render(testObj.name);
let newOb = ob(data);
newOb.addOb(function () {
render(data.name);
})
};
vm(testObj);
// 如果直接设置testObj.name = 'test';就会触发对应的修改
以上,基本上实现了数据和视图间的绑定。
可以再继续改进,在render之前,加入virtual dom的逻辑,或者加入一些语法特性,比如类似VUE和React的语法糖。
由于直接设置对象属性其实不大安全,而且不易于追踪,可以把状态统一提取出来,进一步封装,只能通过action去触发修改,然后分发到各个调用方。保证数据的单项流动。
这里是一个简单的例子。
感谢阅读。
撸一个简单的MVVM例子的更多相关文章
- 230行实现一个简单的MVVM
作者:mirone链接:https://zhuanlan.zhihu.com/p/24451202来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. MVVM这两年在前端届 ...
- 一个简单的CORBA例子
因为对CORBA分析的需要,这里写一个简单的CORBA例子.从JDK1.2开始,JDK中集成了ORB的实现,本例子使用了JDK1.7,对于JDK1.2+应该都没有问题.这个例子实现一个简单的加减乘除的 ...
- 轻松创建nodejs服务器(1):一个简单nodejs服务器例子
这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下 我们先来实现一个简单的例子,hello world ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-3/3(Unity3D开发之二十七)
使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Netw ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-1/3(Unity3D开发之二十五)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51006463 ...
- 一个简单的cmake例子
一个简单的cmake例子CMakeLists.txt,生成动态库文件,可以指定发布目录. 尚不支持: 1.交叉编译环境配置 2.添加依赖库 #在当前目录新建一个build目录,然后cd build ...
- 如何实现一个简单的MVVM框架
接触过web开发的同学想必都接触过MVVM,业界著名的MVVM框架就有AngelaJS.今天闲来无事,决定自己实现一个简单的MVVM框架玩一玩.所谓简单,就是仅仅实现一个骨架,仅表其意,不摹其形. 分 ...
- 一个简单的 MVVM 实现
简介 一个简单的带有双向绑定的 MVVM 实现. 例子 使用 新建一个 ViewModel 对象, 参数分别为 DOM 元素以及绑定的数据即可. 指令 本 MVVM 的指令使用 data 数据, 即 ...
随机推荐
- html元素 input各种输入限制
1.取消按钮按下时的虚线框,在input里添加属性值 hideFocus 或者 HideFocus=true <input type="submit" value=" ...
- 原生js、jQuery实现选项卡功能
在大家在网上平常浏览网页的时候,想必各位都会看到选项卡功能,在这里给大家详解一下用原生js.jQuery如何来写一些基本的选项卡 话不多说,先给各位看一下功能图: 好了,下边 ...
- AngularJs动态添加元素和删除元素
动态添加元素和删除元素 //通过$compile动态编译html var html="<div ng-click='test()'>我是后添加的</div>" ...
- 关于Telnet使用
一.telnet作用 可以使用telnet检查 ip port的连通性 语法: telnet ip port 注意点: 1.使用前先操作系统安装telnet: 2.ip port 中间没有 “:”: ...
- [算法练习]Two Sum
题目说明: Given an array of integers, return indices of the two numbers such that they add up to a speci ...
- 【OBJC】数字转中文大写
博客园都不知道怎么外链图片…… - (void)numToString:(double)num{ ; NSMutableString *szChMoney = [[NSMutableString al ...
- Installing TensorFlow on Ubuntu
1.安装方法有4种,官方推荐是第一种. virtualenv(官方推荐) "native" pip Docker Anaconda 2.基于virtualenv的 ...
- Oracle案例06—— OGG-01098 Could not flush "./dirdat/e1000004383" (error 28, No space left on device)
一.前言 自从换了新环境,各种问题层出不穷,如果不是之前积累的经验丰富,估计都歇菜了,看来作为数据库全栈工程师(oracle/mysql/sqlserver/sap hana/pg/mongodb/r ...
- 【转】修复关于apache-xampp的问题:Port 443 in use by “vmware-hostd.exe”!
在电脑里装了VMware后,再要装xampp,十有八九就会出现这个问题: 11:23:37 [Apache] Problem detected! 11:23:37 [Apache] ...
- 【Leetcode】【Medium】Letter Combinations of a Phone Number
Given a digit string, return all possible letter combinations that the number could represent. A map ...