简朴的JavaScript组件化完成

作为一位前端菜鸟,近来看react例子,依据明白本身也简朴完成了一下组件的继续和事宜机制。

代码在这里

原始的组件写法

(function($) {
    $.pluginName = function(element, options) {
        var defaults = {
            title: '',
            content: '',
            showOKBtn: 1, // 显现肯定按钮
            showCCBtn: 1, // 显现作废按钮
            onFoo: function() {} // callback
        }

        var plugin = this;
        plugin.settings = {}

        var $element = $(element);

        plugin.init = function(options) {
            this.settings = $.extend({}, defaults, options);
            this.initNode(options);
        }

        // public method.
        plugin.show = function() {
            // ...
        }
        plugin.hide = function() {
            // ...    
        }

        plugin.initNode = function(options) {
            var $okBtn = $element.find(''),
                $content = $element.find('');
            // ....
            // 部份逻辑
            $content.text(plugin.settings.content);
            $okBtn.on('click', $.proxy(this.onOk, this));
        }

        plugin.onOk = function(){
            this.hide();
            plugin.settings.onFoo();
        }

        plugin.init();
    }

    $.fn.pluginName = function(options) {
        return this.each(function() {
            if (undefined == $(this).data('pluginName')) {
                var plugin = new $.pluginName(this, options);
                $(this).data('pluginName', plugin);
            }
        });
    }
})(jQuery);

// 运用
var template = '<div>...弹框html...</div>';
$(template).pluginName({
    content: '肯定删除该地点'
}).show();

平常我们写得入门级jquery组件,基本就是如许一个模板。
这里我们完成了一个基本的弹窗组件,也完成了需求方的请求,oh ye!《简朴的JavaScript组件化完成》

某天需求mm说我们要加一个confirm信息的弹框,只需一个肯定按钮!!还好还好。组件中本来就加了options.showCCBtn的设置,实例化的时刻传一个参数就可以了。分分钟处置惩罚了mm的题目,还获得mm的赞同,想一想都有点小冲动呢。

处置惩罚一套作风类似的组件的时刻,经由过程通报差别的参数来掌握差别的ui显现和逻辑代码实行,确切可以处置惩罚题目,跟着功用的一步步增添,这个组件就变得愈来愈痴肥,代码耦合成度变高,到末了本身都搞不清楚每一个参数差别值代表的意义。何况在团队中都是多个人保护同一个组件,这简直就是一场悲剧。今后mm的立场也变得不好,你还坑害了保护组件的好基友。

继续

这时候刻面向对象的头脑就进场了
《简朴的JavaScript组件化完成》
我们发明设置titile, 封闭窗体是人人共有的功用。这里可以笼统成一个基本组件,新的组件继续这个组件即可。

(function() {
    var BaseWindon = Kclass.extend({
        init: function(options){
           //大众功用 
            $titleElm.text(options.title);
            $closeElm.on('click', $.proxy(this.close, this));
        },
                    // 烧毁
        destroy: function(){
                    
        }
        close: function(){

        }
    };
    return BaseWindon;
})()

 在子类中 require('BaseWindon');

 (function() {
    var AddAddressWindon = BaseWindon.extend({
        init: function(options){
            // 挪用parent的init
            this.supr();
        },
        validate: function(){

        },
        // 组件本身的功用
        submit: function(){

        }
    };
    return AddAddressWindon;
})()

javascript oo的完成有很多种,我用了ded/klass,supr的完成比较奇妙。重要道理为:猎取要领的代码字符串,经由过程正则检测字符串中是不是包括 supr,若包括, 则改写该要领,在改写的要领中动态的转变this.supr,使其指向父类同名要领,以完成挪用父类要领的目标。详细的道理可看参考野生小技能–继续中的super()完成

这时候需求mm又来了,需求mm说当用户点击肯定以后要加一个其他功用,实在第一个例子中,我们也可以完成如许的功用。我们可以通报一个callback onFoo。

我们须要引入一种越发文雅的体式格局,参考node的事宜机制。人人晓得,Node.js可以在浩瀚的后端JavaScript手艺当中脱颖而出,恰是因其基于事宜的特性而遭到迎接。

事宜机制

事宜机制对应着一种设想形式-观察者形式。

(function() {
    var win = new BaseWindow();

    win.on('ok', function(){
        console.log('on ok!');
    });

    win.emit('ok');  
    // log  --- on ok!
})()

完成在这里

明显事宜驱动的体式格局越发文雅,相比之下第一种手动触发callback的体式格局显得有点out。事宜机制的体式格局,在监听on和触发emit的时机上也显得越发天真,关于只须要触发一次的callback,你只须要用once函数来监听。写代码彷佛倏忽变得好爽好惬意。

末了记得供应一个烧毁组件的要领,一个简朴的组件就完成了。
完全的代码在这里

固然要更好的组件还须要供应

  1. 模板机制

  2. 双向绑定

    原文作者:amibug
    原文地址: https://segmentfault.com/a/1190000003853252
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞