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

  • 时间:
  • 浏览:0
  • 来源:大发uu快3_uu快3计划网_大发uu快3计划网

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

2015-01-28 19:11  Justany_WhiteSnow  阅读(...)  评论()  编辑  收藏
<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>

基本概念

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) {
        

通用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.$set('msg', obj);
  • 对于数组可使用大次要数组措施,目前后后 支持了:pushpopunshiftshiftindexOfspliceforEachfilter

性能如保

感谢@ouvenzhang提供的测试数据,具体参考https://github.com/miniflycn/Q.js/tree/master/benchmarks

用例Q.jsjQueryNative
单节点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%
50000个节点repeat渲染操作OPS 13.54 ops/sec ±2.32% 31.67 ops/sec ±5.45% 前另有一个 数据为通常的模版引擎
  • 分类 Javascript
  •