摘要:我們?yōu)槭裁匆獙懡M件呢這里不細分組件插件控件,追究其原因無非讓代碼,能夠復用,追求更快的開發(fā)效率。最終解決在寫組件的時候,業(yè)務邏輯部分,現(xiàn)預留配置項,以便后面業(yè)務發(fā)生改變,通過配置項來重置。
我們?yōu)槭裁匆獙懡M件呢?這里不細分組件、插件、控件,追究其原因無非讓代碼,能夠復用,追求更快的開發(fā)效率。其實還有個重要的原因,項目大了之后,難以維護。這個時候就會把項目中重復的部分抽取出來,形成一個組件。但是組件也會有些"缺點",這個最后講。
組件需求要實現(xiàn)如圖的一個條件選擇器
有的時候,項目時間緊張,就會直接切圖,通過jquery的dom選擇器實現(xiàn)這個"簡單的功能"。
需求分析為了更好的維護,以及更好的復用此組件,就要做些抽象。
數(shù)據(jù)層:用來決定按鈕個數(shù)以及按鈕是否選擇
表現(xiàn)層:按鈕使用現(xiàn)有的ui組件
邏輯層:按鈕事件等邏輯處理
數(shù)據(jù)層data: null, choseT: 0, choseF: 0, getDataStatistics: function() { var list = this.data; var choseT = 0; var choseF = 0; var len = list.length; for (var i = 0; i < list.length; i++) { if(list[i].checked == "checked") { choseT++; }else { choseF++; } } return { choseT: choseT, choseF: choseF, len: len }; }, dataChangeAll: function(checked) { var list = this.data; var len = list.length; checked = checked || ""; if(checked == "checked") { this.choseT = len; this.choseF = 0; }else { this.choseT = 0; this.choseF = len; } for (var i = 0; i < len; i++) { list[i].checked = checked; } }, dataChangeSingle: function(index, checked) { var list = this.data; var choseT = this.choseT; var choseF = this.choseF; if(checked == "checked") { choseT++; choseF--; }else { choseT--; choseF++; } this.choseT = choseT; this.choseF = choseF; list[index].checked = checked; }
數(shù)據(jù)層主要對原始數(shù)據(jù)做些CURD的一些操作,具體的操作看具體的業(yè)務需求,但是要具有這個意識。
表現(xiàn)層說白了表現(xiàn)層也就是template層或者view層,就是用戶所看到的,一般會用一個比較成熟的ui庫,比如bootstrap。
getHtml: function(list, statistic) { var html = ["", ""].join(""); return html; }, getChoseNav: function(statistic) { var checkAll = ""; var checkNone = ""; var len = statistic.len; if(statistic.choseT == len) { checkAll = "checked"; } if(statistic.choseF == len) { checkNone = "checked"; } return [ "", "" ].join(""); }, getChoseItem: function(list) { var inputs = ""; var doInputFunc = function(i, detail) { return [ "", "", "", this.getChoseNav(statistic), "", "", this.getChoseItem(list), "", "", "", "", ].join(""); }; for (var i = 0; i < list.length; i++) { inputs += doInputFunc(i, list[i]); } return inputs; }, domAction: function($el, type, data) { var html = ""; type = type || "all"; if(type == "item") { html = this.getChoseItem(data); $el.find(".J_view_checkItems").html(html); }else if(type == "all") { html = this.getChoseNav(data); $el.find(".J_view_checkNav").html(html); } }
眾所周知,template就是根據(jù)數(shù)據(jù)渲染成html,在spa項目尤其重要。
邏輯層這層主要做 調(diào)用template方法將數(shù)據(jù)渲染到頁面上;將頁面上的一些事件結(jié)果,映射到數(shù)據(jù)層。其實現(xiàn)在流行的MVVM模式,就是在邏輯層這里做了更多的事情,只是開發(fā)者們不用去關(guān)心細節(jié)處理,更專注業(yè)務的開發(fā)。
eventBind: function($el) { var _this = this; var $target = ""; // 全選 $el.on("change", ".J_view_checkAll", function() { if(!$(this).parent().hasClass("checked")) { _this.module.dataChangeAll("checked"); _this.view.domAction($el, "all", _this.module.getDataStatistics()); _this.view.domAction($el, "item", _this.module.data); } }); // 全不選 $el.on("change", ".J_view_checkNone", function() { if(!$(this).parent().hasClass("checked")) { _this.module.dataChangeAll(""); _this.view.domAction($el, "all", _this.module.getDataStatistics()); _this.view.domAction($el, "item", _this.module.data); } }); // 單個 $el.on("click", ".J_view_checkItem", function() { $target = $(this); var index = $target.val(); var checked = ""; if($target.prop("checked")) { checked = "checked"; } _this.module.dataChangeSingle(index, checked); _this.view.domAction($el, "all", _this.module.getDataStatistics()); }); }, eventUnbind: function($el) { $el.off("change"); $el.off("click"); },
完整案例
總結(jié)這樣子寫能更好的抽象出公共部分,在其它模塊就只要傳入數(shù)據(jù)就可以了,不用重復拷貝代碼了。
一開始說到組件會有‘缺點’?尤其是業(yè)務組件?
分析項目版本迭代是一個很正常的事情,第一版的時候,比如這個數(shù)據(jù)選擇項這個組件,在每個模塊都有這樣的需求。但是在下一個版本的時候,產(chǎn)品經(jīng)理在其中一個模塊更改了業(yè)務需求,這就導致這個模塊的數(shù)據(jù)選擇項,跟其它模塊的數(shù)據(jù)選擇項不一樣了,但是又有80%甚至90%的相似度,這個時候就非常困擾,到底是重新寫個,還是再對原來的組件,增加個兼容配置項?
重新寫會有很多重復的代碼。新增配置項,又必須保證之前所有的模塊都要正確,得必須都驗證過去。有人就會覺得直接去驗證好了啊,但是項目大了之后,一個一個去驗證不是解決問題的辦法。
最終解決在寫組件的時候,業(yè)務邏輯部分,現(xiàn)預留配置項,以便后面業(yè)務發(fā)生改變,通過配置項來重置。尤其是覺得產(chǎn)品經(jīng)理會更改頻繁的部分。
實在是覺得更改邏輯較大,那就重新寫個吧,因為一個一個去驗證之前的模塊的成本還是很大的。
原文地址 http://tostring.site/2016/07/16/%E6%80%8E%E4%B9%88%E5%86%99%E5%A5%BD%E7%BB%84%E4%BB%B6/
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/87795.html
摘要:前言如何寫出可維護和可讀性高的代碼,這一直是一個困擾很多人的問題??偨Y(jié)在開始寫業(yè)務之前,理應先想清楚需求和業(yè)務邏輯,設計出合理的數(shù)據(jù)結(jié)構(gòu),對代碼進行好的分層,這樣在一定程度上可以寫出可維護性更高的代碼。 前言 如何寫出可維護和可讀性高的代碼,這一直是一個困擾很多人的問題。關(guān)于變量如何起名、如何優(yōu)化if else之類的小技巧,這里就不做介紹了,推薦去看《代碼大全2》,千書萬書,都不如一本...
摘要:就是一個用于搭建類似于網(wǎng)頁版知乎這種表單項繁多,且內(nèi)容需要根據(jù)用戶的操作進行修改的網(wǎng)頁版應用。單頁應用程序顧名思義,單頁應用一般指的就是一個頁面就是應用,當然也可以是一個子應用,比如說知乎的一個頁面就可以視為一個子應用。 最近在逛各大網(wǎng)站,論壇,以及像SegmentFault等編程問答社區(qū),發(fā)現(xiàn)Vue.js異?;鸨?,重復性的提問和內(nèi)容也很多,樓主自己也趁著這個大前端的熱潮,著手學習了一...
摘要:所以這中間需要一個取舍,哪些是要嚴格要求的,哪些是可以不管的。首先,好代碼可能是聊出來的。比如需求確認這一塊,多問多畫流程圖少動手。在這個過程中不斷整理和梳理原有的概念。代碼的直接修改。最后,好代碼是改出來的。 作為前端負責人,很多時候發(fā)愁的不是寫好代碼,而是怎么讓身邊水平較差的小伙伴能寫出好的代碼 另外,你還要保證項目的進度,所以代碼質(zhì)量和項目進度之間有著天然的矛盾,怎么去平衡值得我...
閱讀 2055·2023-04-25 15:11
閱讀 3540·2021-09-23 11:57
閱讀 1393·2021-07-26 23:38
閱讀 1331·2019-08-30 15:54
閱讀 649·2019-08-30 15:53
閱讀 3259·2019-08-26 13:36
閱讀 1001·2019-08-26 12:01
閱讀 2877·2019-08-23 16:21