Redux 對於通訊工程專業的來講能夠這麼理解redux
在不用Redux的時候,組件中的信息傳遞就好像我經過用嘴巴說的方式向你傳遞信息,可是當週圍環境比較嘈雜信息比較多或者我距離你比較遠的時候,信息的傳遞就比較費勁了,一句兩句還好,多了確定會很累。後端
那麼Redux是個什麼存在呢?他就像一個基站,我和你們的全部數據傳遞都用手機打給你的手機,然而手機與手機之間的信息傳遞不是 手機 <-----> 手機這樣的。函數
而是 手機 <----> 基站 <----> 手機 這樣的關係。工具
而 Redux對於整個單頁來講就有點像基站的存在,全部數據統一經過Redux來進行管理。spa
Redux的出現是爲了讓應用當中全部動做和狀態統一管理,讓一切有據可循。設計
store與state的區別,state是應用的一個狀態,本質上來講他是一個普通對象。code
而store是state對象的一個管理者,包含下面四個函數視頻
getState() # 獲取整個 state
dispatch(action) # ※ 觸發 state 改變的【惟一途徑】※
subscribe(listener) # 您能夠理解成是 DOM 中的 addEventListener
replaceReducer(nextReducer) # 通常在 Webpack Code-Splitting 按需加載的時候用
state和store存在這種關係: 對象
var state = store.getState();
在Redux當中規定,一個應用只有單一的store,而且不能直接修改store當中的stateblog
var state = store.getState() state.counter = state.counter + 1 // 禁止在業務邏輯中直接修改 state
改變store當中的state只能經過dispatch一個action來進行,這個是修改應用狀態的惟一方法
就好像你不能直接和基站說你要發短信,發QQ消息,打電話給誰誰誰,這個確定是行不通的。
你須要經過手機來選擇具體的操做,你須要發送短信,就打開短信工具,而後發送短信。須要打電話就打開通信錄選擇對方打過去。須要發送QQ視頻就打開QQ發送視頻。
這些具體的動做就是action,你須要選擇一個具體的動做而後發送信息,而後基站才能經過這些具體的動做來執行,達到目的。
那麼store是怎麼來的呢?
你須要一個基站,那麼基站如何知道怎麼處理你發送過來的各類不一樣的信息,而且作出正確的處理呢?
這個就須要你在設計製造這個「基站」的時候根據你的需求來設計出一個具體的處理方案。
這個時候就須要一個 createStore ,這個就是製造「基站」的工廠。
調用createStore傳入一個reducer來生成一個store.
reducer就好像是你的設計圖,你把這個設計圖給一個叫 reducer 的代工廠,這個代工廠就會根據你的設計圖來給你製做出一個特製的基站,用來處理你的各類數據操做。
import { createStore } from 'redux' ... const store = createStore(reducer, initialState) // store 是靠傳入 reducer 生成的哦!
是一個 函數,負責更新並返回一個新的
而 主要用於先後端同構的數據同步(詳情請關注 React 服務端渲染)
reducerstateinitialState
實質上是一個包含type屬性的普通對象,這個type是store這個基站用來識別用戶行爲的關鍵。
{ type: 'ADD_TODO', // 發短信,打電話,發送qq視頻,發送qq消息... payload: { //發送的信息, QQ消息,語音消息。。。。 id: 1, content: '待辦事項1', completed: false } }
Action當中的信息只用type是必需要的,其餘的數據能夠是任意的。
Action Creator 是 action
的創造者,本質上就是一個函數,返回值是一個 action
(對象)
var id = 1 function addTodo(content) { return { type: 'ADD_TODO', payload: { id: id++, content: content, // 待辦事項內容 completed: false // 是否完成的標識 } } }
這樣就不須要每次有新的相同行爲的時候都從新定義一個了,直接使用action creator來生成傳入變量便可
用戶每次 dispatch(action)
後,都會觸發 reducer
的執行reducer
的實質是一個函數,根據 action.type
來更新 state
並返回 nextState
最後會用 reducer
的返回值 nextState
徹底替換掉原來的 state
var initState = { counter: 0, todos: [] } function reducer(state, action) { // ※ 應用的初始狀態是在第一次執行 reducer 時設置的 ※ if (!state) state = initState switch (action.type) { case 'ADD_TODO': var nextState = _.cloneDeep(state) // 用到了 lodash 的深克隆 nextState.todos.push(action.payload) return nextState default: // 因爲 nextState 會把原 state 整個替換掉 // 若無修改,必須返回原 state(不然就是 undefined) return state } }
通俗點講,就是 reducer
返回啥,state
就被替換成啥
store
由 Redux 的 createStore(reducer)
生成
state
經過 store.getState()
獲取,本質上通常是一個存儲着整個應用狀態的對象
action
本質上是一個包含 type
屬性的普通對象,由 Action Creator (函數) 產生
改變 state
必須 dispatch
一個 action
reducer
本質上是根據 action.type
來更新 state
並返回 nextState
的函數
reducer
必須返回值,不然 nextState
即爲 undefined
實際上,state
就是全部 reducer
返回值的彙總