vuex - redux - mobx


vuex

  尤大大曾說過,Vuex 其實是一個針對 Vue 特化的 Flux,主要是為了配合 Vue 本身的響應式機制。當然吸取了一些 Redux 的特點,比如單狀態樹(用一個對象就包含了所有的應用層級狀態,至此它便作為唯一數據源的存在,這也意味着沒一個應用僅僅包含一個store實例,單一的狀態樹能夠讓我們直接的定位任一特定狀態片段)和便於測試和熱重載的 API,但是也選擇性的放棄了一些在 Vue 的場景下並不契合的特性,比如強制的 immutability(在保證了每一次狀態變化都能追蹤的情況下強制的 immutability 帶來的收益就很有限了)、為了同構而設計得較為繁瑣的 API、必須依賴第三方庫才能相對高效率地獲得狀態樹的局部狀態等等(相比之下 Vuex 直接用 Vue 本身的計算屬性就可以)所以 Vue + Vuex 會更簡潔,也不需要考慮性能問題,代價就是 Vuex 只能和 Vue 配合。Vue + Redux 也不是不可以,但是 Redux 作為一個泛用的實現和 Vue 的契合度肯定不如 Vuex。

  

  

  在業務中,使用vue的比例是比較高的,說到vue的狀態管理不得不提到vuex,vuex也是基於flux的產品,所以在某種意義上與redux想象,但又有不同。和redux使用不可變數據來表示state不同,vuex中沒有render來生成全新的state來替換舊的state。Vuex中的state是可以修改的。這么做的原因和vue運行機制有關,vue是基於ES5的getter/setter來實現視圖數據的雙向綁定,因此,vue中的視圖變更可以通過setter通知到視圖中對應的指令來實現視圖更新。

  Mutation

    Vuex中的state可以修改,不過修改state的方式不是通過actions,而是通過mutations,Vuex 中的 mutation 非常類似於事件:每個 mutation 都有一個字符串的 事件類型 (type) 和 一個 回調函數 (handler)。這個回調函數就是我們實際進行狀態更改的地方,並且它會接受 state 作為第一個參數:

     

    不能直接調用mutation handler,需要以相應的type調用store.commit方法

    

 

  Action

    1).action可以看成是連接視圖與state的橋梁,它會被視圖調用,並由它來調用 mutation handler,向 mutation 傳入 payload。

    

    

    2).Action與mutation不同在於

           Action提交的是mutation,而不是直接變更狀態,

           Action中可以包含任何的異步操作

      Action通過dispatch觸發

      

    3).在組件中使用 this.$store.dispatch('xxx') 分發 action,或者使用 mapActions 輔助函數將組件的 methods 映射為 store.dispatch 調用(需要先在根節點注入 store

      

Mobx and  Redux

  前景:當我們使用react開發文本應用時,在react組件內可以通過this.setState()和this.state處理或訪問組件內狀態,但是隨着隨着項目的增大,狀態變得復雜,通常考慮組件之間的通信問題:某個狀態需要在多個組件共享、某組件內交互需要其他組件狀態更新,對此,react組件開發實踐推薦將公用組件狀態提升。但是,當項目越發復雜時,我們發現僅僅是提升狀態已經無法適應如此復雜的狀態管理,程序狀態變得比較難同步操作,這意味着我們需要更好的狀態管理方式,於是引入了狀態管理庫,如redux、mobx、alt(基於flux使用javascript應用來管理數據的類庫,簡化了flux的store、actions、dispatcher)

  Mobx

    

  redux

    

 

 

  相同點:

    a)      統一維護管理應用狀態

    b)     某一狀態只有一個可信數據來源-store 狀態容器

    c)      操作更新狀態方式統一,並且可控(通常以action方式提供更新狀態的途徑)

    d)     將react組件從業務上分為容器組件和展示型組件(視圖)

   不同點:

    1.   函數式和面向對象

      Redux 更多的是遵循函數式編程思想,而Mobx更多的是從面向對象角度考慮問題

      Redux提倡函數式代碼,如reducer就是一個純函數.純函數接受輸入,然后輸出結果,除此之外不會有任何影響,也包括不會影響接受的參數

      Mobx更多偏向於面向對象編程和響應式編程,通常將狀態包裝成可觀察對象(observable),於是我們就可以使用可觀察對象的所有能力,一旦所有狀態對象變更,就能自動獲得更新

 

              2.   單一和多個store

      Store是應用管理數據的地方,在Redux中,我們總是將所有共享的數據集中在一個大的store中,而Mobx則通常按模塊將應用狀態划分,在多個獨立的store中管理

 

              3.   Javascript對象和可觀查對象

                     Redux以javascript原生對象形式存儲數據,而Mobx使用可觀察對象

                     Redux需要手動追蹤所有狀態對象的變更,

                     Mobx中可以監視可觀察對象,當其變更時自動觸發監聽

 

              4. 不可變(immutable)和可變(mutable)

      Redux狀態通常是不可變的,我們不能直接操作狀態對象,而是在原來狀態基礎上返回一個新的狀態對象,這樣就能方便應用上一狀態,而Mobx中直接使用新值更新狀態對象  

 

      5.   mobx-react 和 react-redux

       使用react和redux連接時,需要使用react-redux提供的provider和connect

         1)、Provider 負責將store注入React應用中

           

         2)、Connect 負責將store state注入容器組件,並選擇特定的狀態為容器組件props傳遞

           

          對於Mobx而言同樣需要兩個步驟:

         1. Provider 利用mobx-react提供的provider將所有的組件注入

           

         2.   使用inject將特定的store注入組件,store可以傳遞狀態或action;

            然后使用observer保證組件能響應store中的客觀查對象observable變更,即store更新,組件視圖響應式更新

            

    

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM