国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

Hanks10100 / 2493人閱讀

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

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

代碼在這里

原始的組件寫法
(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();

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

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

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

繼承

這時候面向?qū)ο蟮乃季S就出場了

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

(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){
            // 調(diào)用parent的init
            this.supr();
        },
        validate: function(){

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

        }
    };
    return AddAddressWindon;
})()

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

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

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

事件機(jī)制

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

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

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

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

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

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

最后記得提供一個銷毀組件的方法,一個簡單的組件就完成了。
完整的代碼在這里

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

模板機(jī)制

雙向綁定

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/86048.html

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

    fjcgreat 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<