1. 程式人生 > >Flux,Redux,Vuex整理總結

Flux,Redux,Vuex整理總結

關於前端架構中的狀態管理方法論,經常能聽到的Flux, Redux 和Vuex,這些方法論乍一看好像都差不多,再一看又有一些區別,這是我剛剛接觸這些東西時的一個直觀感受。看了很多其他人寫的文章,自己又畫了點圖謝謝品味了一下,我決定還是把它們寫出來,既能鞏固所得,又可以方便以後時常溫習。

記得React剛出來不久時,Flux還是React官方指定,Redux那會兒還沒有影,當時認真看了Flux,隔了一年多再回頭竟然忘了個乾淨,有人問到我時的表現像是完全沒聽說過。這也是我重新看過之後決定整理一下的原因。

廢話不多少,言歸正傳,關於Flux, Redux和Vuex三者的關係呢,先用一句話總結:

它們都是基於單向資料流的狀態管理方法論。Flux最早提出,作為對傳統前端MVC的一種改進(我不認為是顛覆)。Redux深受Flux的啟發,又加入了函數語言程式設計的思想,算是Flux的極大增強版本。Vuex可以說是基於Flux並且吸收了Redux的一些特點,但它與Vue是緊密捆綁的。Redux其實除了在React中廣泛應用,Angular.js以及Angular2中也完成了它的實現。

Flux 要點

Flux
備註:虛線小紅框會在比較Redux和Flux時用到。

  • View:
    1. 確定相應的Store以及監聽其變化來更新檢視。
    2. 發起Action。
// Get binding store
var ListStore = require('../stores/ListStore'); ..... // Subscribe store change event componentDidMount: function() { ListStore.addChangeListener(this._onChange); } ... // Pass action to Dispatcher createNewItem: function (event) { // There's a dispatcher instance in ButtonActions ButtonActions.addNewItem('new item'
); }
  • Action:

    1. 每個Action都是一個物件,包含一個actionType屬性(說明動作的型別)和一些其他屬性(用來傳遞資料)
  • Dispatcher:

    1. 全域性唯一。
    2. 邏輯簡單,只用來派發action去相應的store。
    3. 通過 AppDispatcher.register() 來登記各種Action的回撥函式。
// dispatcher/AppDispatcher.js 全域性唯一
var Dispatcher = require('flux').Dispatcher;
var ListStore = require('../stores/ListStore');
module.exports = new Dispatcher();
.....
//註冊action回撥函式
AppDispatcher.register(function (action) {
  switch(action.actionType) {
    case 'ADD_NEW_ITEM':
      ListStore.addNewItemHandler(action.text);
      ListStore.emitChange();
      break;
    default:
      // no op
  }
})

// actions/ButtonActions.js。dispatch方法只用來分發action
var AppDispatcher = require('../dispatcher/AppDispatcher');
var ButtonActions = {
  addNewItem: function (text) {
    AppDispatcher.dispatch({
      actionType: 'ADD_NEW_ITEM',
      text: text
    });
  },
};
  • Store:
    1. 存放view中的資料。
    2. 傳送change事件,通過view中定義的handler捕捉變化。
var EventEmitter = require('events').EventEmitter;
var assign = require('object-assign');

var ListStore = assign({}, EventEmitter.prototype, {
  // data in View
  items: [],
  .......
  emitChange: function () {
    this.emit('change');
  },
  addChangeListener: function(callback) {
    this.on('change', callback);
  }
  ....
});

Redux 要點

Redux

What is Redux

  • A single, immutable data store.
  • One-way data flow.
  • An approach to change based on pure functions and a stream of actions.

Redux 設計思想

(1)Web 應用是一個狀態機,檢視與狀態是一一對應的。

(2)所有的狀態,儲存在一個物件裡面。

Redux vs Flus: Redux = Reducer + Flux

1.Redux將Flux中的Dispatcher併入了Store。也可以理解為Redux沒Dispatcher。Redux的設想是使用者永遠不會變動資料,應該在reducer中返回新的物件來作為應用的新狀態。

2.Redux增加了Reducer.

注:通過程式碼對比的直觀感受就是Flux中的view需要知道具體對應哪個store。而在Redux中,store成為一個被所有view共享的公共物件,view只需要通過store.dispatch()來發送action,無需關心具體處理函式。

  • View:
    1. 通過全域性唯一的store dispatch action 以及獲取最新state
      注: 通過對比flux的view 部分可以看出在Redux中,view不會關心具體的處理函式,只專注於收發就好。
      Redux View
  • Store:
    1. 全域性唯一
    2. 包含整棵state樹: state 和 view 是一一對應的關係
    3. Dispatcher功能已被整合進store:store.dispatch()
    4. state 一旦有變化,store 就會呼叫通過store.subscribe()註冊的回撥函式(一般是render)。
    5. Reducer的拆分就先不講了。
const Counter = ({ value, onIncrement, onDecrement }) => (
  <div>
  <h1>{value}</h1>
  <button onClick={onIncrement}>+</button>
  <button onClick={onDecrement}>-</button>
  </div>
);

const reducer = (state = 0, action) => {
  switch (action.type) {
    case 'INCREMENT': return state + 1;
    case 'DECREMENT': return state - 1;
    default: return state;
  }
};

const store = createStore(reducer);

const render = () => {
  ReactDOM.render(
    <Counter
      value={store.getState()}
      onIncrement={() => store.dispatch({type: 'INCREMENT'})}
      onDecrement={() => store.dispatch({type: 'DECREMENT'})}
    />,
    document.getElementById('root')
  );
};

render();
store.subscribe(render);
  • Action:
    1. 普通物件,作用與Flux中相同
const action = {
  type: 'ADD_TODO', //必填欄位
  payload: 'Learn Redux'
};
  • Reducer:
    1. reducer是current stae 和 action 為引數計算new state的純函式。
    2. 純函式無副作用:不能呼叫系統 I/O 的API,不能呼叫Date.now()或者Math.random()等不純的方法,因為每次會得到不一樣的結果 blabla…
const defaultState = 0;
const reducer = (state = defaultState, action) => {
  switch (action.type) {
    case 'ADD':
      return state + action.payload;
    default: 
      return state;
  }
};
const state = reducer(1, {
  type: 'ADD',
  payload: 2
});
// Reducer 是純函式,就可以保證同樣的State,必定得到同樣的 View。
// 但也正因為這一點,Reducer 函式裡面不能改變 State,必須返回一個全新的物件,請參考下面的寫法。
function reducer(state, action) {
  return Object.assign({}, state, { thingToChange });
  // Or
  return { ...state, ...newState };
}
// State 是一個數組
function reducer(state, action) {
  return [...state, newItem];
}

Vuex 要點

這是一張來自Vuex官網的圖:
Vuex

下面的圖是我重新畫的,風格與之前的Redux和Flux的資料流圖相同,以便與比較:

Vuex

Redux vs Vuex:

  1. 使用mutation來替換redux中的reducer
  2. Vuex有自動渲染的功能,所以無需要專門監聽state。(this.$store.getters.doneTodosCount)
  3. Vuex中的action是一個函式集合物件,用於async/sync commit mutaions. 和Redux或者Flux中的action只是簡單物件有本質不同,只是叫了一個相同名字。
    注:個人認為action和mutation合在一起就是Redux中的Reducer

先到這裡吧,想到什麼新的東西再來補充。以上是我對前端狀態管理方法論的個人理解,可能有錯誤的地方,歡迎指正:)

相關推薦

FluxReduxVuex整理總結

關於前端架構中的狀態管理方法論,經常能聽到的Flux, Redux 和Vuex,這些方法論乍一看好像都差不多,再一看又有一些區別,這是我剛剛接觸這些東西時的一個直觀感受。看了很多其他人寫的文章,自己又畫了點圖謝謝品味了一下,我決定還是把它們寫出來,既能鞏固所得,

實踐webpack+es6+react+redux+antd構建專案(二) reactreduxantd引入

上一篇文章是關於從零構建一個webpack專案,基本已經啟動成功了,這篇文章將會講一下在專案中使用目前最流行的React框架 1、引入babel相關 現代前端基本都是以es6為規範進行開發,所以我們專案中也就需要引入es6。es6是需要使用babel進行轉換的,瀏覽器才能識別 npm

資料管理工具FluxReduxVuex的區別

目錄 為什麼要進行資料管理? 怎麼有效地進行資料管理? 資料管理工具 1. Flux 2. Redux 3. Vuex 使用資料管理工具的場景

fluxvuexredux 要了解什麼。

如果讓你用一句話總結一下什麼是flux,該怎麼說? 官網上有這樣的介紹:flux是一種思想,一種框架,是facebook給react。。。 這樣的解釋對程式設計師來說,顯得過於抽象又不具體了。 阮老師的文章,也將官網的介紹很好的翻譯了一遍。讀了以後可以瞭解到flux是由

在react專案中使用redux-thunkreact-reduxredux;使用總結

先看是什麼,再看怎麼用: redux-thunk是一個redux的中介軟體,用來處理redux中的複雜邏輯,比如非同步請求; redux-thunk中介軟體可以讓action建立函式先不返回一個action物件,而是返回一個函式;   react-redux相當於一個適配react的一個re

Atitit 提升記憶效率 有失真壓縮原理總結 目錄 1. 常見方法 1 1.1. 抽象化提升一層 概念化 1 1.2. 骨架 目錄化 大綱化 歸納整理 1 1.3. 提取關鍵詞 摘要

Atitit  提升記憶效率  有失真壓縮原理總結     目錄 1. 常見方法 1 1.1. 抽象化提升一層 概念化 1 1.2. 骨架 ,目錄化  大綱化 歸納整理 1 1.3. 提取關鍵詞 ,摘要 ,丟棄細節部分 1

Elasticsearch Query DSL 整理總結(二)—— 要搞懂 Match Query看這篇就夠了

目錄 引言 構建示例 match operator 引數 analyzer lenient 引數 Fuzziness fuzzniess 引數 什麼是模糊搜尋? Levenshtein Edit Dist

Atitit 提升記憶效率 有失真壓縮原理總結 目錄 1. 常見方法 1 1.1. 抽象化提升一層 概念化 1 1.2. 骨架 目錄化 大綱化 歸納整理 1 1.3. 提取關鍵詞 摘要

Atitit  提升記憶效率  有失真壓縮原理總結 目錄 常見方法 抽象化提升一層 概念化 骨架 ,目錄化  大綱化 歸納整理 如何目錄化,按照大綱來即可 提取關鍵詞 ,摘要 ,丟棄細節部分 通

Elasticsearch Query DSL 整理總結(一)—— Query DSL 概要MatchAllQuery全文查詢簡述

目錄 引言 雖然之前做過 elasticsearch 的專案,但是沒有對整個專案的知識點進行過系統的整理。這次趁著對 elasticsearch 版本的升級的機會(從2.2 升級到 6.3) ,又專門花時間對涉及到的知識點重新梳理了一遍。 俗話說,好記性不如爛筆頭。為了加深對 elasticsearch 的

Elasticsearch Query DSL 整理總結(二)—— 要搞懂 Match Query看這篇就夠了

目錄 引言 昨天是感恩節,上幼兒園的女兒在老師的叮囑下,晚上為我和老婆洗了腳(形式上的^_^),還給我們每人端了一杯水。看著孩子一天天的長大,懂事,感覺很開心,話說咱們程式設計師這麼辛苦是為了什麼?不就是為了老婆,孩子,熱炕頭,有一個溫暖幸福的家庭,再捎帶著用程式碼改變一下世界嗎?想到這裡,頓時覺得學習,創

項目期復習總結1:背景圖合並hack瀏覽器內核前綴偽類after before

標準 after 不同 fixed cli 條件 人員 tle ble 文件夾: 1、背景圖合並和CSS Spirit 2、PS基本快捷鍵 3、hack技術基本書寫,為什麽不用? 4、內核前綴 5、偽類afterbefore 1、背景

JavaScript if(x)==和===解析(翻譯整理)

ise work word any abc exp string ota always 一、if()中的布爾判斷 if ( Expression ) 表達式會通過ES5定義的ToBoolean方法強制把Expression 轉換成布爾值。 數據類型 轉換結果 Un

90129013三極管總結

href line content 音頻 晶體管 資料 editable track 查找 一、三極管9012 9012是非經常見的晶體三極管。在收音機以及各種放大電路中經常看到它。應用範圍非常廣,它是PNP型小功率三極管。 1 PNP9012三極

《代碼整潔之道》總結——類系統測試叠進

邏輯 測試的 總結 容器管理 重復 -s 整潔之道 整潔 容器 類 類和前面說的函數一樣,應該功能單一且小巧,越小耦合性越低 系統 把系統的構造和使用分開。不要讓構造影響使用,也不要讓程序的運行反過來影響構造。這就需要工廠模式來創建一個容器管理類的生成,IOC是一種很

關於UNIX網絡編程的的OSI1.7章的總結

編程 osi模型 七層 總結 api 硬件 網絡層 協議 linux OSI模型共七層:7:應用層 6:表示層 5:會話層 4:傳輸層 3:網絡層 2:數據鏈路層 1:物理層 網際協議族:應用層 TCP/UDP IPv4 空 ipv6 設備驅動程序和硬件 上

45.使用webpack,reactredux搭倆個界面

ebp logger tags main you end reac Redux ade 整理好寫 { "private": true, "version": "0.0.1", "desc

第三章節理論知識的總結

是把 變量名 位運算符 length diag 創建 理論 designer desing 第三章 認識運算符和表達式 ,運算符又叫操作符,是一個用於運算的符號,作用於一個或多個操作數。運算符分類:一元(目)運算符,作用於一個操作數。二元(目)運算符,作用於兩個操作數。三元

asp.net 表單數據提交常見方式與錯誤總結

state 屬性 服務器 ews 一個 2.0 就會 數據頁面 url 在ASP中,我們通常把表單提交到另外一個頁面(接受數據頁面)。但是在ASP.NET中,服務端表單通常都是提交到本頁面的,如果我設置 form1.action="test.aspx"; 那麽就會導致視圖驗

SEO從業五年軟文編寫經驗總結

軟文從事SEO工作五年,對於很多SEO的技術也有一些自己的經驗和想法,在這裏想和大家交流一下關於SEO中的主要一塊——軟文編寫的經驗和總結。一、最關鍵:蜘蛛喜歡收錄並且有排名蜘蛛喜歡的,用戶不一定喜歡;用戶喜歡的,蜘蛛一定喜歡二、基本原則內容原創度+關鍵詞相關性+關鍵詞布局合理+內容通順規範三、標題編輯要點主

Python常用內置函數整理(lambdareducezipfiltermap)

zip strong true reduce iter 每一個 ssi 理解 python 匿名函數lambda lambda argument1,argument2,...argumentN :expression using arguments 1、lambda是一個表