Road to the future——伪MVVM库Q.js

模仿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% 前一个数据为通常的模版引擎
时间: 2024-08-26 12:39:42

Road to the future——伪MVVM库Q.js的相关文章

JS源码分析│简易mvvm库的设计实现

作者:刀哥(朱建) 前言:mvvm模式即model-view-viewmodel模式简称,单项/双向数据绑定的实现,让前端开发者们从繁杂的dom事件中解脱出来,很方便的处理数据和ui之间的联动.本文将从vue的双向数据绑定入手,剖析mvvm库设计的核心代码与思路. 1.需求整理与分析 需求: 数据一旦改变则更新数据对应的ui ui改变则触发事件改变ui对应的数据 分析: 通过dom节点的指令获取刷新函数,用来刷新指定的ui. 实现一个桥接的方法,让刷新函数和需要的数据关联起来. 监听数据变化,数

javascript日期处理库-Datejs.js

原文:http://code.google.com/p/datejs/wiki/APIDocumentation javascript日期处理库-Datejs.js 当天时间 Date.today(); 比较两个时间大小,返回-1,0,1 var today = Date.today(); var past = Date.today().add(-6).days(); var future = Date.today().add(6).days(); Date.compare(today, fut

轻量级MVVM框架Vue.js快速上手(MVVM、SEO单页面应用)

轻量级MVVM框架Vue.js快速上手(MVVM.SEO单页面应用.×××服务器端渲染.Nuxt.js) 网盘地址:https://pan.baidu.com/s/1LkhepNpGAtRjrxp_CVJNIg 密码: d483备用地址(腾讯微云):https://share.weiyun.com/5tTLqQk 密码:pxezuj Vue.js是一套构建用户界面的轻量级MVVM框架,与其他重量级框架不同的是, Vue.js 的核心库只关注视图层,并且非常容易学习,很容易与其它前端技术或已有的项

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

网页3D效果库Three.js初窥 背景 一直想研究下web页面的3D效果,最后选择了一个比较的成熟的框架Three.js下手 ThreeJs官网 ThreeJs-github; 接下来我会陆续翻译 Three.js官网的文档,部分文字和代码为我个人添加. 第一部分:three.js介绍 创建场景 这部分的目标是为Three.js做一个简单的介绍,我们会以创建一个场景,一个旋转的立方里开始,文章的结尾会有一个可运行的完整示例为你解惑. 开始之前 在你使用Three.js之前,你需要在你的电脑上建

移动端的内容滑块js库 swipe.js

swipe.js 是一个轻量级的移动端内容滑块,类似于pc端的slide.js,用于实现轮播广告或其他内容滑动模块 ,支持移动端屏幕滑动手势操作.此库不依赖于任何其他的js库,可独立使用 使用swipe.js时只需将下载好的文件引用到页面,然后在页面中写好对应的结构 <div id="slider" class="swipe"> <div class="swipe-wrap"> <div></div>

Crosswalk Cordova windows下编译出现:bin\node_modules\q\q.js:126 throw e问题解决方法

Crosswalk Cordova windows下编译出现:bin\node_modules\q\q.js:126   throw e问题解决方法 Crosswalk Cordova 编译出现以下问题 D:\code\crosswalk\crosswalk-cordova-10.39.235.15-arm\bin\node_modules\q\q.js:126 throw e; ^ Package name must look like: com.company.Name 原因是:create

q.js实现nodejs顺序调用

nodejs的异步调用有时候是最让人头疼的,如何能是一些代码顺序的执行呢,这里和大家分享nodejs的promise 什么是promise promise一个标准,它描述了异步调用的返回结果,包括正确返回结果和错误处理.关于详细的说明文档可以参考Promises/A+.目前实现promise标准的模块有很多,如Q.bluebird和Deferred,下面我们以Q为例,介绍一下promise在nodejs中的使用方法. 我查找了关于promise的使用,其中最好用的就是q.js了,个人觉得.当然还

MVC、MVP、MVVM、Angular.js、Knockout.js、Backbone.js、React.js、Ember.js、Avalon.js 概念摘录

转自:http://www.cnblogs.com/xishuai/p/mvc-mvp-mvvm-angularjs-knockoutjs-backbonejs-reactjs-emberjs-avalonjs.html MVC MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是将 M 和 V 的实现代码分离,从而使同一个程序可以使用不同的表现形式. 交互方式(所有通信都是单向的): View 传送指令到 Contro

前端学习-使用JS库Leaflet.js生成世界地图并获取标注地址经纬度。

介绍:Leaflet是一个开源的JavaScript库,对移动端友好且对地图有很好的交互性. 大小仅仅只有 33 KB, 同时具有大多数地图所需要的特点. Leaflet设计的非常简单易懂, 同时具有很好的性能和易用性. 它在桌面端和移动端都工作的相当高效,并有大量的插件用于扩张Leaflet的功能.微信公众号:673399718嘻嘻demo图如下: 使用leaflet.js生成世界地图非常方便,配置参数记录下,有兴趣的可以看看本例中引入jquery操作dom.首先:在页面的头部引入css文件c