成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

簡(jiǎn)單的JavaScript組件化實(shí)現(xiàn)

Hanks10100 / 2497人閱讀

摘要:作為一名前端菜鳥(niǎo),最近看例子,根據(jù)理解自己也簡(jiǎn)單實(shí)現(xiàn)了一下組件的繼承和事件機(jī)制。公共功能銷(xiāo)毀在子類(lèi)中調(diào)用的組件自己的功能的實(shí)現(xiàn)有很多種,我用了,的實(shí)現(xiàn)比較巧妙。最后記得提供一個(gè)銷(xiāo)毀組件的方法,一個(gè)簡(jiǎn)單的組件就完成了。

作為一名前端菜鳥(niǎo),最近看react例子,根據(jù)理解自己也簡(jiǎn)單實(shí)現(xiàn)了一下組件的繼承和事件機(jī)制。

代碼在這里

原始的組件寫(xiě)法
(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 = "
...彈框html...
"; $(template).pluginName({ content: "確定刪除該地址" }).show();

一般我們寫(xiě)得入門(mén)級(jí)jquery組件,基本就是這樣一個(gè)模板。
這里我們實(shí)現(xiàn)了一個(gè)基本的彈窗組件,也完成了需求方的要求,oh ye!

某天需求mm說(shuō)我們要加一個(gè)confirm信息的彈框,只要一個(gè)確定按鈕?。∵€好還好。組件中本來(lái)就加了options.showCCBtn的配置,實(shí)例化的時(shí)候傳一個(gè)參數(shù)就可以了。分分鐘解決了mm的問(wèn)題,還得到mm的贊許,想想都有點(diǎn)小激動(dòng)呢。

處理一套風(fēng)格相似的組件的時(shí)候,通過(guò)傳遞不同的參數(shù)來(lái)控制不同的ui顯示和邏輯代碼執(zhí)行,確實(shí)可以解決問(wèn)題,隨著功能的一步步增加,這個(gè)組件就變得越來(lái)越臃腫,代碼耦合成度變高,到最后自己都搞不清楚每個(gè)參數(shù)不同值代表的意思。況且在團(tuán)隊(duì)中都是多個(gè)人維護(hù)同一個(gè)組件,這簡(jiǎn)直就是一場(chǎng)悲劇。從此mm的態(tài)度也變得不好,你還坑害了維護(hù)組件的好基友。

繼承

這時(shí)候面向?qū)ο蟮乃季S就出場(chǎng)了

我們發(fā)現(xiàn)設(shè)置titile, 關(guān)閉窗體是大家共有的功能。這里可以抽象成一個(gè)基礎(chǔ)組件,新的組件繼承這個(gè)組件即可。

(function() {
    var BaseWindon = Kclass.extend({
        init: function(options){
           //公共功能 
            $titleElm.text(options.title);
            $closeElm.on("click", $.proxy(this.close, this));
        },
                    // 銷(xiāo)毀
        destroy: function(){
                    
        }
        close: function(){

        }
    };
    return BaseWindon;
})()

 在子類(lèi)中 require("BaseWindon");

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

        },
        // 組件自己的功能
        submit: function(){

        }
    };
    return AddAddressWindon;
})()

javascript oo的實(shí)現(xiàn)有很多種,我用了ded/klass,supr的實(shí)現(xiàn)比較巧妙。主要原理為:獲取方法的代碼字符串,通過(guò)正則檢測(cè)字符串中是否包含 supr,若包含, 則改寫(xiě)該方法,在改寫(xiě)的方法中動(dòng)態(tài)的改變this.supr,使其指向父類(lèi)同名方法,以完成調(diào)用父類(lèi)方法的目的。具體的原理可看參考野生小技巧--繼承中的super()實(shí)現(xiàn)。

這時(shí)需求mm又來(lái)了,需求mm說(shuō)當(dāng)用戶點(diǎn)擊確定之后要加一個(gè)其他功能,其實(shí)第一個(gè)例子中,我們也可以實(shí)現(xiàn)這樣的功能。我們可以傳遞一個(gè)callback onFoo。

我們需要引入一種更加優(yōu)雅的方式,參考node的事件機(jī)制。大家知道,Node.js能夠在眾多的后端JavaScript技術(shù)之中脫穎而出,正是因其基于事件的特點(diǎn)而受到歡迎。

事件機(jī)制

事件機(jī)制對(duì)應(yīng)著一種設(shè)計(jì)模式-觀察者模式。

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

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

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

實(shí)現(xiàn)在這里

顯然事件驅(qū)動(dòng)的方式更加優(yōu)雅,相比之下第一種手動(dòng)觸發(fā)callback的方式顯得有點(diǎn)out。事件機(jī)制的方式,在監(jiān)聽(tīng)on和觸發(fā)emit的時(shí)機(jī)上也顯得更加靈活,對(duì)于只需要觸發(fā)一次的callback,你只需要用once函數(shù)來(lái)監(jiān)聽(tīng)。寫(xiě)代碼好像突然變得好爽好舒服。

最后記得提供一個(gè)銷(xiāo)毀組件的方法,一個(gè)簡(jiǎn)單的組件就完成了。
完整的代碼在這里

當(dāng)然要更好的組件還需要提供

模板機(jī)制

雙向綁定

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86048.html

相關(guān)文章

  • JavaScript 是如何工作: Shadow DOM 內(nèi)部結(jié)構(gòu)+如何編寫(xiě)?yīng)毩?em>的組件!

    摘要:向影子樹(shù)添加的任何內(nèi)容都將成為宿主元素的本地元素,包括,這就是影子實(shí)現(xiàn)樣式作用域的方式。 這是專(zhuān)門(mén)探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 17 篇。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 如果你錯(cuò)過(guò)了前面的章節(jié),可以在這里找到它們: JavaScript 是如何工作的:引擎,運(yùn)行時(shí)和調(diào)用堆棧的概述! JavaScript 是如何工作...

    godlong_X 評(píng)論0 收藏0
  • 【譯】怎樣創(chuàng)建定制表單組件

    摘要:若你想在諸如元素的組件上應(yīng)用高級(jí)樣式或者想定制組件的行為,你就只能選擇創(chuàng)建自己的表單組件。我們將通過(guò)本文學(xué)習(xí)如何構(gòu)建一個(gè)表單組件。 系列文章說(shuō)明 原文 在許多情況下,[可用的HTML表單組件]()是不夠的。若你想在諸如元素的組件上[應(yīng)用高級(jí)樣式]()、或者想定制組件的行為,你就只能選擇創(chuàng)建自己的表單組件。 我們將通過(guò)本文學(xué)習(xí)如何構(gòu)建一個(gè)表單組件。為達(dá)到目的,我們選擇重構(gòu)元素作為例子...

    AnthonyHan 評(píng)論0 收藏0
  • 【譯】怎樣創(chuàng)建定制表單組件

    摘要:若你想在諸如元素的組件上應(yīng)用高級(jí)樣式或者想定制組件的行為,你就只能選擇創(chuàng)建自己的表單組件。我們將通過(guò)本文學(xué)習(xí)如何構(gòu)建一個(gè)表單組件。 系列文章說(shuō)明 原文 在許多情況下,[可用的HTML表單組件]()是不夠的。若你想在諸如元素的組件上[應(yīng)用高級(jí)樣式]()、或者想定制組件的行為,你就只能選擇創(chuàng)建自己的表單組件。 我們將通過(guò)本文學(xué)習(xí)如何構(gòu)建一個(gè)表單組件。為達(dá)到目的,我們選擇重構(gòu)元素作為例子...

    William_Sang 評(píng)論0 收藏0
  • 【譯】怎樣創(chuàng)建定制表單組件

    摘要:若你想在諸如元素的組件上應(yīng)用高級(jí)樣式或者想定制組件的行為,你就只能選擇創(chuàng)建自己的表單組件。我們將通過(guò)本文學(xué)習(xí)如何構(gòu)建一個(gè)表單組件。 系列文章說(shuō)明 原文 在許多情況下,[可用的HTML表單組件]()是不夠的。若你想在諸如元素的組件上[應(yīng)用高級(jí)樣式]()、或者想定制組件的行為,你就只能選擇創(chuàng)建自己的表單組件。 我們將通過(guò)本文學(xué)習(xí)如何構(gòu)建一個(gè)表單組件。為達(dá)到目的,我們選擇重構(gòu)元素作為例子...

    wanghui 評(píng)論0 收藏0
  • 【譯】統(tǒng)一樣式語(yǔ)言

    摘要:原文地址原文作者譯文出自掘金翻譯計(jì)劃譯者校對(duì)者統(tǒng)一樣式語(yǔ)言在過(guò)去幾年中,我們見(jiàn)證了的興起,尤其是在社區(qū)。根本上來(lái)說(shuō),純粹用于只是一個(gè)命名規(guī)范,它要求樣式的類(lèi)名要遵守的模式。 原文地址:A Unified Styling Language 原文作者:Mark Dalgleish 譯文出自:掘金翻譯計(jì)劃 譯者:ZhangFe 校對(duì)者:JackGit,yifili09 統(tǒng)一樣式語(yǔ)言 在過(guò)...

    fjcgreat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<