什么是Redux ?
“Redux 是 JavaScript 狀態(tài)容器,提供可預(yù)測化的狀態(tài)管理”
Redux 的設(shè)計(jì)思想很簡單,就兩句話:
1.Web 應(yīng)用是一個(gè)狀態(tài)機(jī),視圖與狀態(tài)是一一對應(yīng)的。
2.所有的狀態(tài),保存在一個(gè)對象里面。
redux有三大準(zhǔn)則
1.單一數(shù)據(jù)源
? ?整個(gè)應(yīng)用狀態(tài),都應(yīng)該被存儲(chǔ)在單一store的對象樹中。
2.只讀狀態(tài)
? ?唯一可以修改狀態(tài)的方式,就是發(fā)送(dispatch)一個(gè)動(dòng)作(Action),通俗來講,就是說只有g(shù)etter,沒有setter。
3.使用純函數(shù)去修改狀態(tài),(純函數(shù)是指 不依賴于且不改變它作用域之外的變量狀態(tài)?的函數(shù),也就是說,?純函數(shù)的返回值只由它調(diào)用時(shí)的參數(shù)決定?,它的執(zhí)行不依賴于系統(tǒng)的狀態(tài)(比如:何時(shí)、何處調(diào)用它)
redux的幾個(gè)概念
(1)Action
Action是唯一可以改變狀態(tài)的途徑,服務(wù)器的各種推送、用戶自己做的一些操作,最終都會(huì)轉(zhuǎn)換成一個(gè)個(gè)的Action,而且這些Action會(huì)按順序執(zhí)行,這種簡單化的方法用起來非常的方便。Action 是一個(gè)對象。其中的type屬性是必須的,表示 Action 的名稱:
const action = {
? ? type: 'login',
? ? payload: ...,
? ? ...
};
(2)Store
Store管理著整個(gè)應(yīng)用的狀態(tài),store可以理解為一個(gè)存儲(chǔ)數(shù)據(jù)的倉庫,一個(gè)應(yīng)用就這么一個(gè)倉庫,但本質(zhì)上這個(gè)store是一個(gè)對象。 Redux通過createStore這個(gè)函數(shù),來生成store對象:
import { createStore } from 'redux';
const store = createStore(fn);
Store提供了一個(gè)方法dispatch,這個(gè)就是用來發(fā)送一個(gè)動(dòng)作,去修改Store里面的狀態(tài)
store.dispatch({
? type: 'login',
? payload: '...'
});
然后可以通過getState方法來重新獲得最新的狀態(tài),也就是state。
簡潔介紹 state
state就是當(dāng)前的狀態(tài),那么store和state是什么關(guān)系呢? 我們可以認(rèn)為 store 對象包括所有數(shù)據(jù),如果想得到某個(gè)時(shí)點(diǎn)的數(shù)據(jù),就要對 Store 生成快照。這種時(shí)點(diǎn)的數(shù)據(jù)集合,就叫做 State。?
通過store.getState()我們可以得到某一時(shí)點(diǎn)的 state。
import { createStore } from 'redux';
const store = createStore(fn);
const state = store.getState();
Redux 規(guī)定, 一個(gè) State 對應(yīng)一個(gè) View。只要 State 相同,View 就相同
簡單的說:getState() 會(huì)返回當(dāng)前的state樹。(當(dāng)前很重要)。 即state是當(dāng)前數(shù)據(jù)的狀態(tài)。?
(3)Reducer
當(dāng)dispatch之后,getState的狀態(tài)發(fā)生了改變,Reducer就是用來修改狀態(tài)的。Reducer 是一個(gè)函數(shù),它接受 Action 和當(dāng)前 State 作為參數(shù),返回一個(gè)新的 State。
const reducer = function (state, action) {
? // ...
? return new_state;
};
借鑒一張圖來形容他們的關(guān)系:

什么時(shí)候需要rudux?
簡單說,如果你的UI層非常簡單,沒有很多互動(dòng),Redux 就是不必要的,用了反而增加復(fù)雜性。
1.用戶的使用方式非常簡單
2.用戶之間沒有協(xié)作
3.不需要與服務(wù)器大量交互,也沒有使用 WebSocket
4.視圖層(View)只從單一來源獲取數(shù)據(jù)
上面這些情況,都不需要使用 Redux。
用戶的使用方式復(fù)雜
1.不同身份的用戶有不同的使用方式(比如普通用戶和管理員)
2.多個(gè)用戶之間可以協(xié)作
3.與服務(wù)器大量交互,或者使用了WebSocket
4.View要從多個(gè)來源獲取數(shù)據(jù)
上面這些情況才是 Redux 的適用場景:多交互、多數(shù)據(jù)源。
從組件角度看,如果你的應(yīng)用有以下場景,可以考慮使用 Redux。
1.某個(gè)組件的狀態(tài),需要共享
2.某個(gè)狀態(tài)需要在任何地方都可以拿到
3.一個(gè)組件需要改變?nèi)譅顟B(tài)
4.一個(gè)組件需要改變另一個(gè)組件的狀態(tài)