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

資訊專欄INFORMATION COLUMN

怎么寫好組件

wow_worktile / 2765人閱讀

摘要:我們?yōu)槭裁匆獙懡M件呢這里不細(xì)分組件插件控件,追究其原因無非讓代碼,能夠復(fù)用,追求更快的開發(fā)效率。最終解決在寫組件的時(shí)候,業(yè)務(wù)邏輯部分,現(xiàn)預(yù)留配置項(xiàng),以便后面業(yè)務(wù)發(fā)生改變,通過配置項(xiàng)來重置。

我們?yōu)槭裁匆獙懡M件呢?這里不細(xì)分組件、插件、控件,追究其原因無非讓代碼,能夠復(fù)用,追求更快的開發(fā)效率。其實(shí)還有個(gè)重要的原因,項(xiàng)目大了之后,難以維護(hù)。這個(gè)時(shí)候就會(huì)把項(xiàng)目中重復(fù)的部分抽取出來,形成一個(gè)組件。但是組件也會(huì)有些"缺點(diǎn)",這個(gè)最后講。

組件需求

要實(shí)現(xiàn)如圖的一個(gè)條件選擇器

有的時(shí)候,項(xiàng)目時(shí)間緊張,就會(huì)直接切圖,通過jquery的dom選擇器實(shí)現(xiàn)這個(gè)"簡單的功能"。

需求分析

為了更好的維護(hù),以及更好的復(fù)用此組件,就要做些抽象。

數(shù)據(jù)層:用來決定按鈕個(gè)數(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è)務(wù)需求,但是要具有這個(gè)意識(shí)。

表現(xiàn)層

說白了表現(xiàn)層也就是template層或者view層,就是用戶所看到的,一般會(huì)用一個(gè)比較成熟的ui庫,比如bootstrap。

getHtml: function(list, statistic) {
    var html = 
        ["
", "
", "
", this.getChoseNav(statistic), "
", "
", this.getChoseItem(list), "
", "
", "
"].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 [ "
", "", "
", ].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項(xiàng)目尤其重要。

邏輯層

這層主要做 調(diào)用template方法將數(shù)據(jù)渲染到頁面上;將頁面上的一些事件結(jié)果,映射到數(shù)據(jù)層。其實(shí)現(xiàn)在流行的MVVM模式,就是在邏輯層這里做了更多的事情,只是開發(fā)者們不用去關(guān)心細(xì)節(jié)處理,更專注業(yè)務(wù)的開發(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);
        }
    });
    
    // 單個(gè)
    $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ù)就可以了,不用重復(fù)拷貝代碼了。

一開始說到組件會(huì)有‘缺點(diǎn)’?尤其是業(yè)務(wù)組件?

分析

項(xiàng)目版本迭代是一個(gè)很正常的事情,第一版的時(shí)候,比如這個(gè)數(shù)據(jù)選擇項(xiàng)這個(gè)組件,在每個(gè)模塊都有這樣的需求。但是在下一個(gè)版本的時(shí)候,產(chǎn)品經(jīng)理在其中一個(gè)模塊更改了業(yè)務(wù)需求,這就導(dǎo)致這個(gè)模塊的數(shù)據(jù)選擇項(xiàng),跟其它模塊的數(shù)據(jù)選擇項(xiàng)不一樣了,但是又有80%甚至90%的相似度,這個(gè)時(shí)候就非常困擾,到底是重新寫個(gè),還是再對原來的組件,增加個(gè)兼容配置項(xiàng)?

重新寫會(huì)有很多重復(fù)的代碼。新增配置項(xiàng),又必須保證之前所有的模塊都要正確,得必須都驗(yàn)證過去。有人就會(huì)覺得直接去驗(yàn)證好了啊,但是項(xiàng)目大了之后,一個(gè)一個(gè)去驗(yàn)證不是解決問題的辦法。

最終解決

在寫組件的時(shí)候,業(yè)務(wù)邏輯部分,現(xiàn)預(yù)留配置項(xiàng),以便后面業(yè)務(wù)發(fā)生改變,通過配置項(xiàng)來重置。尤其是覺得產(chǎn)品經(jīng)理會(huì)更改頻繁的部分。

實(shí)在是覺得更改邏輯較大,那就重新寫個(gè)吧,因?yàn)橐粋€(gè)一個(gè)去驗(yàn)證之前的模塊的成本還是很大的。

原文地址 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://specialneedsforspecialkids.com/yun/87795.html

相關(guān)文章

  • 如何寫好前端業(yè)務(wù)代碼?

    摘要:前言如何寫出可維護(hù)和可讀性高的代碼,這一直是一個(gè)困擾很多人的問題。總結(jié)在開始寫業(yè)務(wù)之前,理應(yīng)先想清楚需求和業(yè)務(wù)邏輯,設(shè)計(jì)出合理的數(shù)據(jù)結(jié)構(gòu),對代碼進(jìn)行好的分層,這樣在一定程度上可以寫出可維護(hù)性更高的代碼。 前言 如何寫出可維護(hù)和可讀性高的代碼,這一直是一個(gè)困擾很多人的問題。關(guān)于變量如何起名、如何優(yōu)化if else之類的小技巧,這里就不做介紹了,推薦去看《代碼大全2》,千書萬書,都不如一本...

    kbyyd24 評論0 收藏0
  • Vue.js新手入門指南[轉(zhuǎn)載]

    摘要:就是一個(gè)用于搭建類似于網(wǎng)頁版知乎這種表單項(xiàng)繁多,且內(nèi)容需要根據(jù)用戶的操作進(jìn)行修改的網(wǎng)頁版應(yīng)用。單頁應(yīng)用程序顧名思義,單頁應(yīng)用一般指的就是一個(gè)頁面就是應(yīng)用,當(dāng)然也可以是一個(gè)子應(yīng)用,比如說知乎的一個(gè)頁面就可以視為一個(gè)子應(yīng)用。 最近在逛各大網(wǎng)站,論壇,以及像SegmentFault等編程問答社區(qū),發(fā)現(xiàn)Vue.js異常火爆,重復(fù)性的提問和內(nèi)容也很多,樓主自己也趁著這個(gè)大前端的熱潮,著手學(xué)習(xí)了一...

    MartinHan 評論0 收藏0
  • React

    摘要:而我只知道有自己的虛擬,它會(huì)對比虛擬和真實(shí)的差別,然后在適當(dāng)?shù)臅r(shí)機(jī)更新頁面。函數(shù)的第一個(gè)參數(shù)只能是一個(gè)標(biāo)簽,不能是并列的兩個(gè)標(biāo)簽。第一個(gè)添加了的屬性,該屬性值指向,意思是該組件名為的靜態(tài)屬性。 網(wǎng)頁總是一個(gè)鏈接著另一個(gè)的,React一大優(yōu)勢在于每次鏈接到另一個(gè)頁面上去的時(shí)候,不需要向傳統(tǒng)頁面一樣,得銷毀所有代碼,重新渲染新頁面的代碼,而只在一個(gè)頁面上展現(xiàn)新的內(nèi)容——單頁頁面。 Reac...

    ningwang 評論0 收藏0
  • React

    摘要:而我只知道有自己的虛擬,它會(huì)對比虛擬和真實(shí)的差別,然后在適當(dāng)?shù)臅r(shí)機(jī)更新頁面。函數(shù)的第一個(gè)參數(shù)只能是一個(gè)標(biāo)簽,不能是并列的兩個(gè)標(biāo)簽。第一個(gè)添加了的屬性,該屬性值指向,意思是該組件名為的靜態(tài)屬性。 網(wǎng)頁總是一個(gè)鏈接著另一個(gè)的,React一大優(yōu)勢在于每次鏈接到另一個(gè)頁面上去的時(shí)候,不需要向傳統(tǒng)頁面一樣,得銷毀所有代碼,重新渲染新頁面的代碼,而只在一個(gè)頁面上展現(xiàn)新的內(nèi)容——單頁頁面。 Reac...

    tain335 評論0 收藏0
  • 代碼質(zhì)量把控和項(xiàng)目進(jìn)度之間的平衡

    摘要:所以這中間需要一個(gè)取舍,哪些是要嚴(yán)格要求的,哪些是可以不管的。首先,好代碼可能是聊出來的。比如需求確認(rèn)這一塊,多問多畫流程圖少動(dòng)手。在這個(gè)過程中不斷整理和梳理原有的概念。代碼的直接修改。最后,好代碼是改出來的。 作為前端負(fù)責(zé)人,很多時(shí)候發(fā)愁的不是寫好代碼,而是怎么讓身邊水平較差的小伙伴能寫出好的代碼 另外,你還要保證項(xiàng)目的進(jìn)度,所以代碼質(zhì)量和項(xiàng)目進(jìn)度之間有著天然的矛盾,怎么去平衡值得我...

    gplane 評論0 收藏0

發(fā)表評論

0條評論

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