Road to the future——伪MVVM库Q.js
模仿Vuejs的
伪MVVM
库,下面是使用说明
项目地址:https://github.com/miniflycn/Q.js
一个简单例子
模版:
<a href="javascript:void(0)" q-text="msg"></a>
脚本:
var vm = new Q({
el: '#demo',
data: {
msg: 'hello'
}
});
则会展示:
<a href="javascript:void(0)">hello</a>
当使用.data方法修改data时候会触发节点数据修改:
vm.$set('msg', '你好');
则会展示:
<a href="javascript:void(0)">你好</a>
TodoMVC例子
我们用Q.js实现了一个TodoMVC的例子:
https://github.com/miniflycn/Q.js/tree/master/examples/todomvc
相比jQuery的实现,分层较为清晰,而比BackBone的实现要简单。
当然我们与Vuejs的实现非常像,咳咳。
基本概念
directive
告知libaray
如何对节点进行操作,遵循Vuejs写法:
<element
prefix-directiveId="[argument:] expression [| filters...]">
</element>
简单例子:
<div q-text="message"></div>
这里表示message
对应的数据,用text
指令进行操作,text
指令是在该节点塞入文字。
自定义directive
举一个我们在todoMVC的例子:
<input q-todo-focus="editing" />
则表示editing
对应的数据变化时执行todo-focus
指令,看看我们todo-focus
指令怎么写的:
directives: {
'todo-focus': function (value) {
// 如果editing的值为false,则不处理
if (!value) {
return;
}
// 为true则,对该节点focus()一下
var el = this.el;
setTimeout(function () {
el.focus();
}, 0);
}
}
通用directive
目前只提供了极少的通用
directive
,未来可拓展
- show - 显示与否
- class - 是否添加class
- value - 改变值
- text - 插入文本
- repeat - 重复节点
- on - 事件绑定
- model - 双向绑定(只支持input、textarea)
- vm - 创建子VM
filter
如果设置了
filter
,则绑定的数据会经过filter
才执行对应的directive
,这是我们可以在塞入数据前做输出处理,或事件触发前做数据处理。
模版:
<input q-model="msg" q-on="keyup: showMsg | key enter" />
key
是其中一个通用filter,基本实现是:
var keyCodes = {
enter : 13,
tab : 9,
'delete' : 46,
up : 38,
left : 37,
right : 39,
down : 40,
esc : 27
};
/**
* A special filter that takes a handler function,
* wraps it so it only gets triggered on specific
* keypresses. v-on only.
*
* @param {String} key
*/
function key(handler, key) {
if (!handler) return;
var code = keyCodes[key];
if (!code) {
code = parseInt(key, 10);
}
return function (e) {
if (e.keyCode === code) {
return handler.call(this, e);
}
};
}
则,当keyup发生,keyCode为13(即enter)时候,才会触发showMsg方法。
method
特制
on
指令会调用的方法,例如:上面讲到的showMsg。
设置方法:
var vm = new Q({
el: '#demo',
data: {
msg: 'hello'
},
methods: {
showMsg: function () {
alert(this.msg);
}
}
});
则那个input框会在初始化时自动设值为hello,当改变时候msg
值也会改变,当按下回车键
,则会触发showMsg方法打印值。
data
大部分操作都和对象与数组的操作相同,只有当设置值的时候需要使用
.$set
方法,因为我们没有defineProperty的支持。
- 得到一个msg的值:
vm.msg
- 设置msg的值
vm.$set('msg', obj);
- 对于数组可使用大部分数组方法,目前已经支持了:
push
、pop
、unshift
、shift
、indexOf
、splice
、forEach
、filter
性能如何
感谢@ouvenzhang提供的测试数据,具体参考https://github.com/miniflycn/Q.js/tree/master/benchmarks
用例 | Q.js | jQuery | Native |
---|---|---|---|
单节点html操作OPS | 82,652 ops/sec ±2.32% | 46,526 ops/sec ±5.45% | 1,101,462 ops/sec ±1.06% |
多节点html操作OPS | 23,641 ops/sec ±0.58% | 4,416 ops/sec ±7.76% | 33,434 ops/sec ±1.37% |
1000个节点repeat渲染操作OPS | 13.54 ops/sec ±2.32% | 31.67 ops/sec ±5.45% | 前一个数据为通常的模版引擎 |
Road to the future——伪MVVM库Q.js的更多相关文章
- 自己动手实现一个MVVM库
我们知道的,常见的数据绑定的实现方法 1.数据劫持(vue):通过Object.defineProperty() 去劫持数据每个属性对应的getter和setter2.脏值检测(angular):通过 ...
- 借助Q.js学习javascript异步编程。
金字塔式 //add1 function step1(n, callback) { setTimeout(function(){ callback.call(null, n + 1); }, 100) ...
- 爬虫实战:汽车之家配置页面 破解伪元素和混淆JS
本篇介绍如何破解汽车之家配置页面的伪元素和混淆的JS. ** 温馨提示:如需转载本文,请注明内容出处.** 本文链接:https://www.cnblogs.com/grom/p/9242156.ht ...
- KnockoutJS---一个极其优秀的MVVM模型的js框架
相信对于DotNet平台的开发人员来讲,MVVM模式已经不再是个陌生的词汇了吧.而我们今天介绍的Knockout JS, 则是一个MVVM模式的JS框架,官方网址:http://knockoutjs. ...
- 移动端手势库Hammer.js学习
感觉移动端原生支持的 touch.tap.swipe 几个事件好像还不够用,某些时候还会用到诸如缩放.长按等其他功能. 近日学习了一个手势库 Hammer.js,它是一个轻量级的触屏设备手势库,能识别 ...
- 网页3D效果库Three.js初窥
网页3D效果库Three.js初窥 背景 一直想研究下web页面的3D效果,最后选择了一个比较的成熟的框架Three.js下手 ThreeJs官网 ThreeJs-github; 接下来我会陆续翻译 ...
- q.js实现nodejs顺序调用
nodejs的异步调用有时候是最让人头疼的,如何能是一些代码顺序的执行呢,这里和大家分享nodejs的promise 什么是promise promise一个标准,它描述了异步调用的返回结果,包括正确 ...
- 深入解析Backbone.js框架的依赖库Underscore.js的作用
这篇文章主要介绍了深入解析Backbone.js框架的依赖库Underscore.js的作用,用过Node.js的朋友对Underscore一定不会陌生:)需要的朋友可以参考下 backbone必须依 ...
- MVC、MVP、MVVM、Angular.js、Knockout.js、Backbone.js、React.js、Ember.js、Avalon.js、Vue.js 概念摘录
注:文章内容都是摘录性文字,自己阅读的一些笔记,方便日后查看. MVC MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是 ...
随机推荐
- radio button(单选按钮)
单选按钮只是input输入框的一种类型. 每一个单选按钮都应该嵌套在它自己的label(标签)元素中. 注意:所有关联的单选按钮应该使用相同的name属性. 下面是一个单选按钮的例子: <lab ...
- Asp.NET MVC 拍卖网站,拆解【2】 Asp.NET MVC章回,第(1)节
时间和篇幅所限,MVC不会介绍基本的建站过程,请参照博客园技术专题文章传送门 英语足够好的请直接去微asp.net 官网 传送门(强烈推荐,尤其是想使用最新技术的时候更应该直接去官网),本文主要介绍 ...
- .NET跨平台:在mac命令行下用vim手写ASP.NET 5 MVC程序
昨天在 Mac 上手写了一个最简单的 ASP.NET 5 程序,直接在 Startup.cs 中通过 Response.WriteAsync() 输出响应内容,详见 .NET跨平台:在Mac上跟着错误 ...
- [ALM]一步一步搭建MS ALM环境 - 安装域服务器
描述: 搭建并配置域服务器,先安装操作系统,配置网络,安装组件,配置域帐号 步骤: 1,打开Hyper-V Manager,参考[Hyper-V]使用操作系统模板创建新的虚拟机,先完成操作系统的安装, ...
- Windows下使用Redis(一)安装使用
一.Redis 是什么 Redis 是一款依据BSD开源协议发行的高性能Key-Value存储系统(cache and store).它通常被称为数据结构服务器,因为值(value)可以是 字符串(S ...
- SharePoint 2013 Service 状态无法启动,显示“启动中(Starting)”
Problem 在SharePoint 2013 Central Administration中启动 SharePoint Service(也称为:Service Machine Instance)时 ...
- Html 字体大小单位 px em pt
网页上定义字体大小有常见三种单位,px.em.pt px px是pixel缩写,是基于像素的单位.在浏览网页过程中,屏幕上的文字.图片等会随屏幕的分辨率变化而变化,一个100px宽度大小的图片,在80 ...
- 【Android】应用程序启动过程源码分析
在Android系统中,应用程序是由Activity组成的,因此,应用程序的启动过程实际上就是应用程序中的默认Activity的启动过程,本文将详细分析应用程序框架层的源代码,了解Android应用程 ...
- Atitit. 高级软件工程师and 普通的区别 高级编程的门槛总结
Atitit. 高级软件工程师and 普通的区别 高级编程的门槛总结 1. 完备的知识体系 2 2. 编程理论/原理的掌握 2 1.1. 掌握常用的概念(ORM,IOC,AOP,event driv ...
- atitit.标准时间格式 互相转换 秒数 最佳实践
atitit.标准时间格式 互相转换 秒数 最佳实践 例如00:01:19 转换为秒数 79,,and互相转换 一个思路是使用div 60 mod...不过麻烦的... 更好的方法是使用stamp ...