一直都說 redux 是 inspired by flux, 也就是說基本上這兩個是差不多的. redux 是遵循 flux 思想開發的一個
react 的狀態管理庫.
那么我們或者說大家都還是有很多說這兩個地方到底有什么不同的地方. 對此我也有自己的一個理解, 理解成了自己的東西才真正是自己的東西
-
flux 基本構成的幾大塊
store
dispatch
action
vm(view)
說 dispatch 是運轉的核心, 其實就是通過 dispatch 去驅動整個的數據流轉.
說觸發關系之前, 有幾個監聽需要注明(1) 首先 store 注冊(其實就是監聽的意思) 了 dispatch 上的事件變化,
view 中監聽了 store 的變化.
(2) 然后 dispatch 變化后, store 進行相應, 然后 trigger(emit, 拋出事件) 變化以供 view 變化
view 中有監聽了 store 的變化, 然后 view 中觸發具體的 render 方法(react , vue 中等等 )核心思想:
更改 store 中的數據一定是通過 dispatch 發送一個 action 來進行實現, 復雜(或者說規則明確)了, 卻能帶來長久的規定與后續的清晰
這樣也能說明是數據的單項流動.這其中並沒有規定只有一個 store, 這個 store 也只是 data, 並不是狀態, 具體的 state(狀態) 與 store 的綁定在 view 這一層.
view 中有具體的響應, store 這里只是把變更發送了出去.
action
在這里可以理解為事件處理, 通過 action 提供接口供 view 層去調用, action 中調用 dispatch去觸發具體的事件
或者把 action 整理理解為一個 事件的派發, 最終是要改變 store或者可以說 flux 只是一個指導思想. 規定數據的單項流動, 更改數據必須走統一的規則 (dispatch)
-
redux 基本構成
store
dispatch
reducer
redux 在 flux 的思想上, 又進一步的約束.- 只有一個 store
- 函數式編程(reducer), 可以對結果進行預測, redux 的
r
就是 reducer - 改變 store 方式唯一(即只有 store 中的 reducer 能夠進行更改)
其實 redux 對 flux 的限制只是限制了 只有一個 store, 並且嚴格約束函數式編程范式.
其中的 store 就是根據 reducer 進行生成的, 並且 dispatch 方法也是 從 store 中返回
一切都圍繞着這一個 store.
數據流程: store 中 dispatch action 后, 派發到對應的 reducer 處理, 然后返回對應的 新狀態.
擴展: 圍繞此基礎上又提供了一些功能加強
1. 比如 middware 加強了 dispatch 方法, 默認 dispatch 是只能接受一個 action 對象
2. replaceReducer, combineReducer 可以認為是對 reducer 的加強
3. immutable 等不可變, 是提高性能, 也算是對 store 的數據加強
- redux-react, 與 react 的結合屬於單獨的一部分, 只簡單說一下
原理: 使用 connect 和 provider, 通過 react 中提供的 context 實現了 state 與 store 的連接.
總結:
目前項目中主要使用 mobx
在做狀態管理, 上邊只是按照自己的理解進行了梳理. redux 在大型項目中的確非常有用,
清晰的數據處理, 對於多人協作是非常有好處的. mobx 快速, 卻也讓我們 不明事理, 但是人家的初衷就是讓你 不用明事理...