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 要點
備註:虛線小紅框會在比較Redux和Flux時用到。
- View:
- 確定相應的Store以及監聽其變化來更新檢視。
- 發起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:
- 每個Action都是一個物件,包含一個actionType屬性(說明動作的型別)和一些其他屬性(用來傳遞資料)
Dispatcher:
- 全域性唯一。
- 邏輯簡單,只用來派發action去相應的store。
- 通過 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:
- 存放view中的資料。
- 傳送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 要點
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:
- 通過全域性唯一的store dispatch action 以及獲取最新state
注: 通過對比flux的view 部分可以看出在Redux中,view不會關心具體的處理函式,只專注於收發就好。
- 通過全域性唯一的store dispatch action 以及獲取最新state
- Store:
- 全域性唯一
- 包含整棵state樹: state 和 view 是一一對應的關係
- Dispatcher功能已被整合進store:store.dispatch()
- state 一旦有變化,store 就會呼叫通過store.subscribe()註冊的回撥函式(一般是render)。
- 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:
- 普通物件,作用與Flux中相同
const action = {
type: 'ADD_TODO', //必填欄位
payload: 'Learn Redux'
};
- Reducer:
- reducer是current stae 和 action 為引數計算new state的純函式。
- 純函式無副作用:不能呼叫系統 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官網的圖:
下面的圖是我重新畫的,風格與之前的Redux和Flux的資料流圖相同,以便與比較:
Redux vs Vuex:
- 使用mutation來替換redux中的reducer
- Vuex有自動渲染的功能,所以無需要專門監聽state。(this.$store.getters.doneTodosCount)
- Vuex中的action是一個函式集合物件,用於async/sync commit mutaions. 和Redux或者Flux中的action只是簡單物件有本質不同,只是叫了一個相同名字。
注:個人認為action和mutation合在一起就是Redux中的Reducer
先到這裡吧,想到什麼新的東西再來補充。以上是我對前端狀態管理方法論的個人理解,可能有錯誤的地方,歡迎指正:)
相關推薦
Flux,Redux,Vuex整理總結
關於前端架構中的狀態管理方法論,經常能聽到的Flux, Redux 和Vuex,這些方法論乍一看好像都差不多,再一看又有一些區別,這是我剛剛接觸這些東西時的一個直觀感受。看了很多其他人寫的文章,自己又畫了點圖謝謝品味了一下,我決定還是把它們寫出來,既能鞏固所得,
實踐webpack+es6+react+redux+antd構建專案(二) react,redux,antd引入
上一篇文章是關於從零構建一個webpack專案,基本已經啟動成功了,這篇文章將會講一下在專案中使用目前最流行的React框架 1、引入babel相關 現代前端基本都是以es6為規範進行開發,所以我們專案中也就需要引入es6。es6是需要使用babel進行轉換的,瀏覽器才能識別 npm
資料管理工具Flux、Redux、Vuex的區別
目錄 為什麼要進行資料管理? 怎麼有效地進行資料管理? 資料管理工具 1. Flux 2. Redux 3. Vuex 使用資料管理工具的場景
flux,vuex,redux 要了解什麼。
如果讓你用一句話總結一下什麼是flux,該怎麼說? 官網上有這樣的介紹:flux是一種思想,一種框架,是facebook給react。。。 這樣的解釋對程式設計師來說,顯得過於抽象又不具體了。 阮老師的文章,也將官網的介紹很好的翻譯了一遍。讀了以後可以瞭解到flux是由
在react專案中使用redux-thunk,react-redux,redux;使用總結
先看是什麼,再看怎麼用: 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
9012,9013三極管總結
href line content 音頻 晶體管 資料 editable track 查找 一、三極管9012 9012是非經常見的晶體三極管。在收音機以及各種放大電路中經常看到它。應用範圍非常廣,它是PNP型小功率三極管。 1 PNP9012三極
《代碼整潔之道》總結——類,系統,測試,叠進
邏輯 測試的 總結 容器管理 重復 -s 整潔之道 整潔 容器 類 類和前面說的函數一樣,應該功能單一且小巧,越小耦合性越低 系統 把系統的構造和使用分開。不要讓構造影響使用,也不要讓程序的運行反過來影響構造。這就需要工廠模式來創建一個容器管理類的生成,IOC是一種很
關於UNIX網絡編程的的OSI,1.7章的總結
編程 osi模型 七層 總結 api 硬件 網絡層 協議 linux OSI模型共七層:7:應用層 6:表示層 5:會話層 4:傳輸層 3:網絡層 2:數據鏈路層 1:物理層 網際協議族:應用層 TCP/UDP IPv4 空 ipv6 設備驅動程序和硬件 上
45.使用webpack,react,redux搭倆個界面
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常用內置函數整理(lambda,reduce,zip,filter,map)
zip strong true reduce iter 每一個 ssi 理解 python 匿名函數lambda lambda argument1,argument2,...argumentN :expression using arguments 1、lambda是一個表