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

資訊專欄INFORMATION COLUMN

前端數(shù)據(jù)驅(qū)動的價值

ivyzhang / 1655人閱讀

摘要:數(shù)據(jù)驅(qū)動應該是從這種模式開始流行的。這種其實已經(jīng)非常趨向與數(shù)據(jù)驅(qū)動了??梢钥吹綌?shù)據(jù)驅(qū)動的難點和關鍵點就是數(shù)據(jù)結構的設計。數(shù)據(jù)驅(qū)動主要是處理模塊之間的一種邏輯。

數(shù)據(jù)驅(qū)動應該是從flux/redux + react這種模式開始流行的。

他的背后不僅僅是數(shù)據(jù)驅(qū)動這么簡單,在復雜的系統(tǒng)中,我覺得它解決了一個很關鍵的問題就是模塊間的交互/通信。有很多文章拿他和mvc/mvvm去比較,我個人覺得沒有特別的可比性,因為解決的問題不同。

以往處理模式

一個稍微復雜點的例子:

假如有這么一個頁面,我們按照以往模式開發(fā),首先模塊化開發(fā),拆分成A,B,C 三個模塊,然后每個模塊有自己的子模塊。

如果需求簡單還比較好解決,每個模塊中自己解決自己的邏輯,解耦的非常清晰。父子之間的關系也非常明確。

例如銷毀C模塊,會自動銷毀它的子模塊C1C101

模塊間的關系也很清晰,B1不會和B2有直接關系,他們之間需要通過B模塊去傳遞。同理,B模塊A模塊也沒有直接關系,他們都需要通過外層頁面去處理關系。

但是假如有這么一個需求,A2的顯示和B2(用戶交互)以及C101(用戶交互)相關怎么辦。

按照這種模式,它的解決方案是:

B2如果發(fā)生改變,通知B模塊,B模塊在通知頁面,頁面調(diào)用A模塊C模塊,C模塊調(diào)用C1,C1調(diào)用C101獲取C101的數(shù)據(jù)處理,頁面調(diào)用A模塊,A模塊再調(diào)用A2,再結合一下從C101獲取的數(shù)據(jù),改變它的展示。

是不是看著很繞,從圖上看是這么個關系:

圖中僅僅顯示了其中一個復雜交互,假如我們再多兩個模塊間關聯(lián)的邏輯:

B1B2模塊影響A2模塊(圖中黃線)

C1影響B1模塊(圖中白線)

如下圖:

3個復雜一點的交互,整個模塊間的通信已經(jīng)變成蜘蛛網(wǎng)了,重要的是,每一條關系線都需要開發(fā)者維護的,不僅影響開發(fā)效率,而且不好維護,容易引發(fā)bug,假如后期加新需求或者調(diào)整需求,開發(fā)成本都是比較高的。

可見,對于復雜的交互,或者模塊間關系復雜時,這種依賴父子關系的通信,是一個很大的障礙。

但是我們怎么辦,拒絕模塊化開發(fā)嗎?那樣頁面設計起來耦合度更大,更加不可維護。

首先一點,模塊化開發(fā)是一個不可逆的趨勢,然而在這種趨勢下,解決模塊化通信是一個非常重要的點。

模塊間通信其他方案

在那個時候,我考慮最多的就是如何去解決模塊之間的通信,如何讓模塊之間交互更加輕松,模塊之間更加獨立。

方案一:

當時考慮的一個方案是使用一個全局的event(全局的on和fire)。這樣模塊之間就不用依賴父子關系了。模塊和模塊間是可以之間交互的。

但是這樣會有一些弊端:

事件名稱如何定義,保證不重名

事件是否會重復的on

模塊和模塊之間會因為事件產(chǎn)生一些耦合

當交互特別復雜時,也會比較麻煩,還是上面的例子,B2通知C2改變后,C2還需要通知C101獲取一次數(shù)據(jù),來確認改變

整體來看:

優(yōu)勢: 擺脫了模塊間父子層級關系,可以簡單的跨模塊通信

劣勢: 依然需要維護復雜的模塊間關系,只是可以繞過父子依賴

方案二:

全局共享一個model + component模式。這種其實已經(jīng)非常趨向與數(shù)據(jù)驅(qū)動了。每個模塊都是共享全局的model,然后每個component都可以被全局獲取到到,里面的功能屬性可以直接被使用。

其實這種模式已經(jīng)比較理想,頁面上面的任何component都可以被直接調(diào)用到并且使用。

個人覺得缺點就是:
多了一個全局可調(diào)用component的功能。如果砍掉他可以實現(xiàn)完成數(shù)據(jù)驅(qū)動,如果模塊調(diào)用時,使用多了直接獲取component的功能,還是需要在模塊間維護好和其他模塊間的交互邏輯。

數(shù)據(jù)驅(qū)動

先看一個圖,我感覺可以很好的體現(xiàn)數(shù)據(jù)驅(qū)動

提線木偶:他的特點就是每個動作都是,頭,手臂,腳,金箍棒都是由操作的人手決定的,頭和手臂直接沒有任何關系。

數(shù)據(jù)驅(qū)動也可以這么理解,頁面上面所以的展示都是由數(shù)據(jù)決定的,和頁面其他地方?jīng)]有任何關系。

再來看看上面那個例子如果加上數(shù)據(jù)驅(qū)動的設計思想。

頁面之間每個模塊,不用關心父子模塊之間的關系,每個獨立的模塊都是由一個全局的model決定。

回到上面那個麻煩的場景。當B2改變時,它會修改model中對應的數(shù)據(jù)(效驗C101數(shù)據(jù),結合B2的改變,修改A2的數(shù)據(jù)),然后A2的業(yè)務模塊跟進A2的數(shù)據(jù)改變。

這種設計的核心是每一個模塊的改變,全部都交給model處理。

然后model里面會和個個模塊一一對應,每個模塊無需關注其他模塊的變化,只需要關注model里面對應自己數(shù)據(jù)的變化即可。所以模塊間關系鏈條會顯得非常簡單。

重點在于,當交互邏輯不斷增加時,這個關系鏈條依然不會增加,因為模塊只和model里面對于的數(shù)據(jù)相關聯(lián)。

當然,這種模式也無法去省略復雜的業(yè)務邏輯,只是業(yè)務邏輯全部都會聚集在model中。可以理解為頁面上所有的操作都是對數(shù)據(jù)的操作。然后每個模塊只需要監(jiān)聽關注的數(shù)據(jù)改變即可,這個監(jiān)聽關系就是圖中唯一的一條關系線。

換一個理解,我們將直接的模塊和模塊直接的耦合關系全部轉(zhuǎn)移到了數(shù)據(jù)中去體現(xiàn)。而數(shù)據(jù)的維護是遠遠比模塊更好維護的。

Model如何對應View

還是上面頁面為例子:

model

var page = {
    a: {
        isShow: true,
        children: [{
            a1: {
                isShow: true
            }
        },
        {
            a2: {
                isShow: true
            }
        }]
    },
    b: {
        isShow: true,
        children: [{
            b1: {
                isShow: true
            }
        },
        {
            b2: {
                isShow: true
            }
        }]
    },
    c: {
        isShow: true,
        children: [{
            c1: {
                isShow: true,
                children: [{
                    c101: {
                        isShow: true
                    }
                }]
            }
        }]
    }
}

isShow 表示展示的意思。這個狀態(tài)對應文章第一個圖片。

當數(shù)據(jù)改變時,例如model發(fā)生變化如下:

var page = {
    a: {
        isShow: true,
        children: [{
            a1: {
                isShow: true
            }
        },
        {
            a2: {
                isShow: false
            }
        }]
    },
    b: {
        isShow: true,
        children: [{
            b1: {
                isShow: true
            }
        },
        {
            b2: {
                isShow: false
            }
        }]
    },
    c: {
        isShow: true,
        children: [{
            c1: {
                isShow: false,
                children: [{
                    c101: {
                        isShow: true
                    }
                }]
            }
        }]
    }
}

對應下面這樣:

換一個理解就是每一種數(shù)據(jù)狀態(tài)對應一種頁面的展示狀態(tài)。頁面想展示成什么樣子,需要數(shù)據(jù)處理成什么樣子。數(shù)據(jù)是這個頁面的核心。

數(shù)據(jù)驅(qū)動開發(fā)關注點

第一點數(shù)據(jù)結構的處理,因為數(shù)據(jù)決定了整個頁面的展示,數(shù)據(jù)結構開始的設計非常關鍵,數(shù)據(jù)結構的可擴展性決定了頁面的可擴展性,如果開始數(shù)據(jù)模式不好,后期維護也會非常難受。

第二點是處理好模塊和數(shù)據(jù)中對應的關系。

可以看到數(shù)據(jù)驅(qū)動的難點和關鍵點就是數(shù)據(jù)結構的設計。而這個也是很考驗開發(fā)者能力的。數(shù)據(jù)結構的好壞直接決定了后期業(yè)務開發(fā)的質(zhì)量。

數(shù)據(jù)驅(qū)動和mvc/mvvm的關系

文章開頭說了,從我的角度理解數(shù)據(jù)驅(qū)動這種模式和mvc并沒有什么競爭關系,在具體的實踐中,每一個模塊可以是一個mvc或者mvvm,模塊的內(nèi)部處理交給模塊自己,可以是mvc,或者單例也可以。數(shù)據(jù)驅(qū)動主要是處理模塊之間的一種邏輯。

那么為什么數(shù)據(jù)驅(qū)動和react這種結合的更加好了?因為react更進一步是講模塊內(nèi)部也實現(xiàn)一個數(shù)據(jù)驅(qū)動,模塊內(nèi)部的數(shù)據(jù)改變了,模塊的狀態(tài)會跟著改變。

微信公眾號

博客地址

http://tangguangyao.github.io/

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

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

相關文章

  • 前端數(shù)據(jù)驅(qū)動陷阱

    摘要:結論三對于某些具體的模塊,單向數(shù)據(jù)流不是萬靈藥,整體架構單向數(shù)據(jù)驅(qū)動,具體模塊可以根據(jù)場景選擇最合適的總結個人感覺數(shù)據(jù)驅(qū)動對于開發(fā)人員的要求其實有一些增加,開發(fā)是需要更多的全局觀,對于業(yè)務需要更加的了解。 showImg(https://segmentfault.com/img/bVsPfl); 年前一篇文章《前端數(shù)據(jù)驅(qū)動的價值》聊了一下數(shù)據(jù)驅(qū)動的一些看法。 其中數(shù)據(jù)驅(qū)動的核心在于...

    Andrman 評論0 收藏0
  • 數(shù)據(jù)驅(qū)動模式借助react實踐探索

    摘要:之前談到過很多次數(shù)據(jù)驅(qū)動的理解,這次通過實際項目檢驗了一下自己的想法。對于數(shù)據(jù)驅(qū)動這種模式,至少從數(shù)據(jù)層,可以規(guī)避,做一層數(shù)據(jù)變化的效驗這個和寫服務端單側差不多。數(shù)據(jù)驅(qū)動和有點類似,只是借用在單頁面上實現(xiàn)了。 之前談到過很多次數(shù)據(jù)驅(qū)動的理解,這次通過實際項目檢驗了一下自己的想法。 相關文件 《前端數(shù)據(jù)驅(qū)動的價值》 《前端數(shù)據(jù)驅(qū)動的陷阱》 項目詳設 詳設的重要性 對于復雜一點的項目,...

    jone5679 評論0 收藏0
  • 數(shù)據(jù)時代,業(yè)務運維驅(qū)動企業(yè)變革

    摘要:業(yè)務運維是運維與企業(yè)業(yè)務深度融合的產(chǎn)物,是運維管理在互聯(lián)網(wǎng)時代和云計算大數(shù)據(jù)技術推動下的必然結果。 從信息化時代起,企業(yè)一直在試圖發(fā)現(xiàn)業(yè)務數(shù)據(jù)中深藏的商業(yè)價值,并為此誕生了數(shù)據(jù)挖掘、商業(yè)智能、BPM、BSM等諸多技術,然而互聯(lián)網(wǎng)時代的到來,專為封閉生產(chǎn)環(huán)境而生的信息化系統(tǒng),已經(jīng)無法滿足企業(yè)高速增長的互聯(lián)網(wǎng)開放業(yè)務和隨著而來的海量信息的處理需求。互聯(lián)網(wǎng)+最大的價值在于連接,企業(yè)根據(jù)原有生...

    iliyaku 評論0 收藏0
  • 職場瓶頸:2~4 年前端走出離職困境與舒適區(qū)

    摘要:著作權歸作者所有。工作年限越長,公司對于開發(fā)者的要求就會越高。了解技術的內(nèi)部機制才能讓自己不被淘汰。 著作權歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系 Scott 獲得授權,非商業(yè)轉(zhuǎn)載請注明出處[務必保留全文,勿做刪減]。 Scott 近兩年無論是面試還是線下線上的技術分享,遇到許許多多前端同學,由于團隊原因,個人原因,職業(yè)成長,技術方向,甚至家庭等等原因,在理想國與現(xiàn)實之間,在放棄與堅守之間,搖擺不停,...

    thursday 評論0 收藏0

發(fā)表評論

0條評論

ivyzhang

|高級講師

TA的文章

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