模仿Vuejs的伪MVVM库,下面是使用说明 
项目地址:https://github.com/miniflycn/Q.js

相关项目:https://github.com/miniflycn/Ques

一个简单例子

模版:

<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);
  • 对于数组可使用大部分数组方法,目前已经支持了:pushpopunshiftshiftindexOfspliceforEachfilter

性能如何

感谢@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的更多相关文章

  1. 自己动手实现一个MVVM库

    我们知道的,常见的数据绑定的实现方法 1.数据劫持(vue):通过Object.defineProperty() 去劫持数据每个属性对应的getter和setter2.脏值检测(angular):通过 ...

  2. 借助Q.js学习javascript异步编程。

    金字塔式 //add1 function step1(n, callback) { setTimeout(function(){ callback.call(null, n + 1); }, 100) ...

  3. 爬虫实战:汽车之家配置页面 破解伪元素和混淆JS

    本篇介绍如何破解汽车之家配置页面的伪元素和混淆的JS. ** 温馨提示:如需转载本文,请注明内容出处.** 本文链接:https://www.cnblogs.com/grom/p/9242156.ht ...

  4. KnockoutJS---一个极其优秀的MVVM模型的js框架

    相信对于DotNet平台的开发人员来讲,MVVM模式已经不再是个陌生的词汇了吧.而我们今天介绍的Knockout JS, 则是一个MVVM模式的JS框架,官方网址:http://knockoutjs. ...

  5. 移动端手势库Hammer.js学习

    感觉移动端原生支持的 touch.tap.swipe 几个事件好像还不够用,某些时候还会用到诸如缩放.长按等其他功能. 近日学习了一个手势库 Hammer.js,它是一个轻量级的触屏设备手势库,能识别 ...

  6. 网页3D效果库Three.js初窥

    网页3D效果库Three.js初窥 背景 一直想研究下web页面的3D效果,最后选择了一个比较的成熟的框架Three.js下手 ThreeJs官网 ThreeJs-github; 接下来我会陆续翻译 ...

  7. q.js实现nodejs顺序调用

    nodejs的异步调用有时候是最让人头疼的,如何能是一些代码顺序的执行呢,这里和大家分享nodejs的promise 什么是promise promise一个标准,它描述了异步调用的返回结果,包括正确 ...

  8. 深入解析Backbone.js框架的依赖库Underscore.js的作用

    这篇文章主要介绍了深入解析Backbone.js框架的依赖库Underscore.js的作用,用过Node.js的朋友对Underscore一定不会陌生:)需要的朋友可以参考下 backbone必须依 ...

  9. 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 的目的是 ...

随机推荐

  1. openssl,db,mysql,sasl编译安装

    yum -y install nfs-utils nfs4-acl-tools nfs-utils-libyum -y install gcc gcc* libtool libtools-ltdl l ...

  2. [Leetcode][JAVA] Word Ladder

    Given two words (start and end), and a dictionary, find the length of shortest transformation sequen ...

  3. 在cocos2d里面如何使用Texture Packer和像素格式来优化spritesheet

    免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作 ...

  4. Robberies(HDU2955):01背包+概率转换问题(思维转换)

    Robberies  HDU2955 因为题目涉及求浮点数的计算:则不能从正面使用01背包求解... 为了能够使用01背包!从唯一的整数(抢到的钱下手)... 之后就是概率的问题: 题目只是给出被抓的 ...

  5. NoSQL精粹(NoSQL Distilled)——序言

    之前说到博客长草的问题,想了想除了很忙特别忙非常忙各种瞎忙忙你妹啊外,主要还是不知道写什么好--到这家公司的两年中从JS到领域驱动到缓存服务器从前端到后端各种折腾,有些东西虽然有所心得,不过既然前人已 ...

  6. ( 转)基于.NET平台常用的框架整理

    自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中也积累了一些开源的组件,就目前想到的先整理于此,如果再想到,就 ...

  7. [转]新兵训练营系列课程——平台RPC框架介绍

    原文:http://weibo.com/p/1001643875439147097368 课程大纲 1.RPC简介 1.1 什么是RPC 1.2 RPC与其他远程调用方式比较 2.Motan RPC框 ...

  8. Dynamic CRM 2013学习笔记(三)快速创建实体 EntityCreater

    一.实体简介 实体用于在 Microsoft Dynamics CRM 中建立业务数据模型和管理业务数据.例如,可以使用客户.市场活动和事件(案例)等实体跟踪和支持销售.市场营销和服务活动.实体具有一 ...

  9. ArcServer 10.0 “No Content”、“Server Host Cannot be null” 错误

    问题一:"No Content" 问题描述: 在输入服务地址时:http://192.168.1.180/arcgis/services   结果出现下面的错误:   解决办法: ...

  10. 转载:开发者眼中最好的 22 款 GUI 测试工具

    对于很多同学来说gui程序的测试是一个难点,所以我从网上转载了一篇关于gui测试的一篇文章,里面罗列的很多工具,大家可以尝试一下学习学习. 英文原文:22 best GUI testing tools ...