摘要:作為一名前端菜鳥(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
摘要:向影子樹(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 是如何工作...
摘要:若你想在諸如元素的組件上應(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)元素作為例子...
摘要:若你想在諸如元素的組件上應(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)元素作為例子...
摘要:若你想在諸如元素的組件上應(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)元素作為例子...
摘要:原文地址原文作者譯文出自掘金翻譯計(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ò)...
閱讀 904·2021-10-13 09:39
閱讀 1491·2021-10-11 10:57
閱讀 2604·2019-08-26 13:53
閱讀 2547·2019-08-26 12:23
閱讀 3700·2019-08-23 18:30
閱讀 3758·2019-08-23 18:08
閱讀 2530·2019-08-23 18:04
閱讀 2967·2019-08-23 16:28