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

資訊專欄INFORMATION COLUMN

我對(duì) React Flux 架構(gòu)的理解

hankkin / 675人閱讀

摘要:當(dāng)響應(yīng)時(shí),通過(guò)已注冊(cè)的回調(diào)函數(shù),將提供的數(shù)據(jù)負(fù)載發(fā)送給應(yīng)用中的所有。對(duì)外只暴露,不允許提供禁止在任何地方直接操作。是單例作為中的事件分發(fā)中心,同時(shí)還要管理所有中的事件。

React Flux架構(gòu)簡(jiǎn)介

個(gè)人現(xiàn)階段對(duì)Flux架構(gòu)的理解,求拍磚求star!
原文鏈接:https://github.com/kuitos/kuitos.github.io/issues/27

React 簡(jiǎn)介請(qǐng)戳 這里

Flux是什么

Flux是Facebook用來(lái)構(gòu)建客戶端web應(yīng)用的應(yīng)用架構(gòu)。它利用單向數(shù)據(jù)流的方式來(lái)組合react中的視圖組件。它更像一個(gè)模式而不是一個(gè)正式的框架,開(kāi)發(fā)者不需要太多的新代碼就可以快速的上手Flux。

Flux的核心部分

1. dispatcher

事件調(diào)度中心,flux模型的中心樞紐,管理著Flux應(yīng)用中的所有數(shù)據(jù)流。它本質(zhì)上是Store的回調(diào)注冊(cè)。每個(gè)Store注冊(cè)它自己并提供一個(gè)回調(diào)函數(shù)。當(dāng)Dispatcher響應(yīng)Action時(shí),通過(guò)已注冊(cè)的回調(diào)函數(shù),將Action提供的數(shù)據(jù)負(fù)載發(fā)送給應(yīng)用中的所有Store。應(yīng)用層級(jí)單例?。?/p> 2. store

負(fù)責(zé)封裝應(yīng)用的業(yè)務(wù)邏輯跟數(shù)據(jù)的交互。

Store中包含應(yīng)用所有的數(shù)據(jù)

Store是應(yīng)用中唯一的數(shù)據(jù)發(fā)生變更的地方

Store中沒(méi)有賦值接口---所有數(shù)據(jù)變更都是由dispatcher發(fā)送到store,新的數(shù)據(jù)隨著Store觸發(fā)的change事件傳回view。Store對(duì)外只暴露getter,不允許提供setter?。〗乖谌魏蔚胤街苯硬僮鱏tore。

3. view

controller-view 可以理解成MVC模型中的controller,它一般由應(yīng)用的頂層容器充當(dāng),負(fù)責(zé)從store中獲取數(shù)據(jù)并將數(shù)據(jù)傳遞到子組件中。簡(jiǎn)單的應(yīng)用一般只有一個(gè)controller-view,復(fù)雜應(yīng)用中也可以有多個(gè)。controller-view是應(yīng)用中唯一可以操作state的地方(setState())

view(UI組件) ui-component 職責(zé)單一只允許調(diào)用action觸發(fā)事件,數(shù)據(jù)從由上層容器通過(guò)屬性傳遞過(guò)來(lái)。

4. 其他

action creators 作為dispatcher的輔助函數(shù),通常可以認(rèn)為是Flux中的第四部分。ActionCreators是相對(duì)獨(dú)立的,它作為語(yǔ)法上的輔助函數(shù)以action的形式使得dispatcher傳遞數(shù)據(jù)更為便利。

How Flux(Unidirectional Data Flow) Works

view --> actionCreators

// Nav.jsx
export default class Nav extends React.Component {

  _handleClick(nav) {
    NavActionCreators.clickNav(nav);
  }

  render() {

    let itemList = this.props.list.map((nav, index) => {
      return (
        
  • {nav.text}
  • ); }); return ( ); } }

    action dispatch

    // NavActionCreators.js
    export default {
    
      clickNav(nav){
    
        AppDispatcher.dispatch(
          {
            type: ActionTypes.CLICK_NAV,
            nav
          }
        );
      }
    };

    dispatcher --> store callback

    AppDispatcher.register(action => {
    
      switch (action.type) {
    
        // nav點(diǎn)擊
        case ActionTypes.CLICK_NAV:
    
          IndexWebAPIUtils.getGiftList(_currentUserInfo.userId, action.nav.id)
            .then(function (giftList) {
    
              _currentGiftList = giftList;
              IndexStore.emitChange();
            });
    
          break;
    
        // no default
      }
    });

    store emitChange --> controller view --> setState

    export default class Index extends React.Component {
    
      constructor(props) {
        super(props);
        let currentUser = UserStore.getCurrentUser();
        this.state = IndexStore.getAll();
      }
    
      componentDidMount() {
        IndexStore.addChangeListener(this._onChange.bind(this));
      }
    
      componentWillUnmount() {
        IndexStore.removeChangeListener(this._onChange.bind(this))
      }
    
      _onChange() {
        this.setState(IndexStore.getAll());
      }
    
      render() {
    
        let state = this.state;
    
        return (
          
    ...
    ); } }

    Flux vs MVVM
    MVVM
    1. 簡(jiǎn)單的MVVM

    2. 復(fù)雜的MVC

    Flux 1. 復(fù)雜的Flux

    Flux的優(yōu)勢(shì) 1. 數(shù)據(jù)狀態(tài)變得穩(wěn)定同時(shí)行為可預(yù)測(cè)

    因?yàn)閍ngular雙向綁定的原因,我們永遠(yuǎn)無(wú)法知道數(shù)據(jù)在哪一刻處于穩(wěn)定狀態(tài),所以我們經(jīng)常會(huì)在angular中看到通過(guò)setTimeout的方式處理一些問(wèn)題(其實(shí)有更優(yōu)雅的解決方案,不在本次討論之內(nèi))。同時(shí)由于雙向綁定的原因,行為的流向我們也很難預(yù)測(cè),當(dāng)視圖的model變多的時(shí)候,如果再加上一堆子視圖依賴這些model,問(wèn)題發(fā)生時(shí)定位簡(jiǎn)直是噩夢(mèng)啊(這也是angular的錯(cuò)誤信息那么不友好的原因,因?yàn)榭蚣荛_(kāi)發(fā)者也無(wú)法確定當(dāng)前行為是誰(shuí)觸發(fā)的啊,綁定的人太多了...)。但是這里還是要強(qiáng)調(diào)一點(diǎn)就是,并不是說(shuō)雙向綁定就一定會(huì)導(dǎo)致不穩(wěn)定的數(shù)據(jù)狀態(tài),在angular中我們通過(guò)一些手段依然可以使得數(shù)據(jù)變得穩(wěn)定,只是雙向綁定(mvvm)相對(duì)于flux更容易引發(fā)數(shù)據(jù)不穩(wěn)定的問(wèn)題。

    2. 所有的數(shù)據(jù)變更都發(fā)生在store里

    flux里view是不允許直接修改store的,view能做的只是觸發(fā)action,然后action通過(guò)dispatcher調(diào)度最后才會(huì)流到store。所有數(shù)據(jù)的更改都發(fā)生在store組件內(nèi)部,store對(duì)外只提供get接口,set行為都發(fā)生在內(nèi)部。store里包含所有相關(guān)的數(shù)據(jù)及業(yè)務(wù)邏輯。所有store相關(guān)數(shù)據(jù)處理邏輯都集中在一起,避免業(yè)務(wù)邏輯分散降低維護(hù)成本。

    3. 數(shù)據(jù)的渲染是自上而下的

    view所有的數(shù)據(jù)來(lái)源只應(yīng)該是從屬性中傳遞過(guò)來(lái)的,view的所有表現(xiàn)由上層控制視圖(controller-view)的狀態(tài)決定。我們可以把controller-view理解為容器組件,這個(gè)容器組件中包含若干細(xì)小的子組件,容器組件不同的狀態(tài)對(duì)應(yīng)不同的數(shù)據(jù),子組件不能有自己的狀態(tài)。也就是,數(shù)據(jù)由store傳遞到controller-view中之后,controller-view通過(guò)setState將數(shù)據(jù)通過(guò)屬性的方式自上而下傳遞給各個(gè)子view。

    4. view層變得很薄,真正的組件化

    由于2、3兩條原因,view自身需要做的事情就變得很少了。業(yè)務(wù)邏輯被store做了,狀態(tài)變更被controller-view做了,view自己需要做的只是根據(jù)交互觸發(fā)不同的action,僅此而已。這樣帶來(lái)的好處就是,整個(gè)view層變得很薄很純粹,完全的只關(guān)注ui層的交互,各個(gè)view組件之前完全是松耦合的,大大提高了view組件的復(fù)用性。

    5. dispatcher是單例的

    對(duì)單個(gè)應(yīng)用而言dispatcher是單例的,最主要的是dispatcher是數(shù)據(jù)的分發(fā)中心,所有的數(shù)據(jù)都需要流經(jīng)dispatcher,dispatcher管理不同action于store之間的關(guān)系。因?yàn)樗袛?shù)據(jù)都必須在dispatcher這里留下一筆,基于此我們可以做很多有趣的事情,各種debug工具、動(dòng)作回滾、日志記錄甚至權(quán)限攔截之類(lèi)的都是可以的。

    Flux的困境 1. 過(guò)多的樣板代碼

    flux只是一個(gè)架構(gòu)模式,并不是一個(gè)已實(shí)現(xiàn)好的框架,所以基于這個(gè)模式我們需要寫(xiě)很多樣板代碼,代碼量duang的一下子上來(lái)了。。不過(guò)好在目前已經(jīng)有很多好用的基于flux的第三方實(shí)現(xiàn),目前最火的屬redux。

    2. dispatcher是單例

    dispatcher作為flux中的事件分發(fā)中心,同時(shí)還要管理所有store中的事件。當(dāng)應(yīng)用中事件一多起來(lái)事件時(shí)序的管理變得復(fù)雜難以維護(hù),沒(méi)有一個(gè)統(tǒng)一的地方能清晰的表達(dá)出dispatcher管理了哪些store。

    3. 異步處理到底寫(xiě)在哪里

    按flux流程,action中處理:依賴該action的組件被迫耦合進(jìn)業(yè)務(wù)邏輯

    按store職責(zé)在store中處理:store狀態(tài)變得不穩(wěn)定,dispatcher的waitFor失效

    4. 至今還沒(méi)有官方實(shí)現(xiàn) 寫(xiě)在最后

    前端摩爾定律:前端每18個(gè)月難度增加一倍

    沒(méi)有銀彈

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

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

    相關(guān)文章

    • React.js 最佳實(shí)踐(2016)_鏈接修正版

      摘要:譯者按最近依舊如火如荼相信大家都躍躍欲試我們團(tuán)隊(duì)也開(kāi)始在領(lǐng)域有所嘗試年應(yīng)該是逐漸走向成熟的一年讓我們一起來(lái)看看國(guó)外的開(kāi)發(fā)者們都總結(jié)了哪些最佳實(shí)踐年在全世界都有很多關(guān)于新的更新和開(kāi)發(fā)者大會(huì)的討論關(guān)于去年的重要事件請(qǐng)參考那么年最有趣的問(wèn)題來(lái)了我 譯者按:最近React(web/native)依舊如火如荼,相信大家都躍躍欲試,我們團(tuán)隊(duì)也開(kāi)始在React領(lǐng)域有所嘗試. 2016年應(yīng)該是Reac...

      syoya 評(píng)論0 收藏0
    • 關(guān)于Flux,Vuex,Redux思考

      摘要:關(guān)于的思考是一種前端狀態(tài)管理架構(gòu)思想,專門(mén)解決軟件的結(jié)構(gòu)問(wèn)題。他們給出了一些庫(kù)用于實(shí)現(xiàn)的思想,并在的基礎(chǔ)上做了一些改進(jìn)。在這些框架里,當(dāng)前最熱門(mén)的莫過(guò)于和了。 關(guān)于Flux,Vuex,Redux的思考 Flux是一種前端狀態(tài)管理架構(gòu)思想,專門(mén)解決軟件的結(jié)構(gòu)問(wèn)題。基于Flux的設(shè)計(jì)思想,出現(xiàn)了一批前端狀態(tài)管理框架。他們給出了一些庫(kù)用于實(shí)現(xiàn)Flux的思想,并在Flux的基礎(chǔ)上做了一些改進(jìn)。...

      jsbintask 評(píng)論0 收藏0
    • Redux概念之一: Redux簡(jiǎn)介

      摘要:應(yīng)用這說(shuō)明并不是單指設(shè)計(jì)給用的,它是獨(dú)立的一個(gè)函數(shù)庫(kù),可通用于各種應(yīng)用。在數(shù)據(jù)流的最后,要觸發(fā)最上層組件的,然后進(jìn)行整體的重新渲染工作。單純?cè)诘膶?duì)象上是沒(méi)有辦法使用,要靠額外的函數(shù)庫(kù)才能這樣作,這是一定要使用類(lèi)似像這種函數(shù)庫(kù)的主要原因。 Redux的官網(wǎng)中用一句話來(lái)說(shuō)明Redux是什么: Redux是針對(duì)JavaScript應(yīng)用的可預(yù)測(cè)狀態(tài)容器 這句話雖然簡(jiǎn)短,其實(shí)是有幾個(gè)涵義的: ...

      cjie 評(píng)論0 收藏0
    • React系列之 Flux架構(gòu)模式

      摘要:原文地址由于只涉及層的處理,所以構(gòu)建大型應(yīng)用應(yīng)該搭配一個(gè)框架模式才能使后期維護(hù)成本相對(duì)較小正是官方給出的應(yīng)用架構(gòu),他推崇一種單向的數(shù)據(jù)流動(dòng)模式,看下圖感受下整個(gè)流程是用戶與層交互,觸發(fā)使用進(jìn)行分發(fā)觸發(fā)回調(diào)進(jìn)行更新更新觸發(fā)層事件層收到信號(hào)進(jìn) 原文地址:https://gmiam.com/post/react-... 由于 React 只涉及 UI 層的處理,所以構(gòu)建大型應(yīng)用應(yīng)該搭配一個(gè)框...

      whjin 評(píng)論0 收藏0
    • Android重構(gòu)之旅:架構(gòu)

      摘要:是的架構(gòu)的實(shí)現(xiàn)。是在年提出的一種前端架構(gòu),主要用來(lái)處理復(fù)雜的邏輯的一致性問(wèn)題當(dāng)時(shí)是為了解決頁(yè)面的消息通知問(wèn)題。 去年10月底來(lái)到了新公司,剛開(kāi)始接手 Android 項(xiàng)目時(shí),發(fā)現(xiàn)該項(xiàng)目真的是一團(tuán)遭,項(xiàng)目開(kāi)發(fā)上沒(méi)有任何架構(gòu)可言,開(kāi)發(fā)人員連簡(jiǎn)單的 MVC、MVP 都不了解,Activity 及其臃腫,業(yè)務(wù)邊界也不明確,因此我決定重新分析一下當(dāng)前主流的幾種開(kāi)發(fā)架構(gòu),選出適合當(dāng)前項(xiàng)目的架構(gòu)形式...

      mylxsw 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

    hankkin

    |高級(jí)講師

    TA的文章

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