目前redux流行的解決方法包括了redux、react-redux、redux-thunk等等。以后會總體來說,現在先說一下,純redux數據流是如何實現的。理解了這個數據流,就基本理解原生redux是如何實現的了,內部流程是什么<p>
下面這個圖是redux的內部流程,我結合這個圖說一下。(個人理解,說錯了,歡迎交流)<p>
action
action是一個單純包含了{type}的對象,type是一個常量用來表示動作類型的。Action需要<code>store.dispath()</code>來來發送信息。例如下面這個例子:
{
type:"one",
text:"one_text"
}
但是通常使用action creator函數來創建action對象,這樣具有靈活性,可以提供更多種的配置。
function action_text(text){
return {
type:"one",
text
}
}
觸發一個動作只需要調用<code>dispath (action_text(text))</code>
Reducer
reducer的作用是用來根據具體情況來更改action對應的state樹的。reducer會接受兩個參數,第一個是<code>state</code>,初始化的<code>state</code>;第二個是<code>action</code>。返回的是一個新的state,這個state可以通過監聽來重新渲染整個UI,這部分在后面會講到。<code>(oldState,action)=>newState</code>
const initialState={
a:"A",
b:"B"
}
function someApp(state = initialState, action) {
switch (action.type) {
case 'CHANGE_A': return { ...state, a: 'Modified a' };
case 'CHANGE_B': return { ...state, b: action.payload };
default: return state
}
Store
現在有了 Action 和 Reducer,Store 的作用就是連接這兩者,Store 的作用有這么幾個:
<ul>
<li>Hold 住整個應用的 State 狀態樹
<li>提供一個 getState() 方法獲取 State
<li>提供一個 dispatch() 方法發送 action 更改 State
<li>提供一個 subscribe() 方法注冊回調函數監聽 State 的更改
</ul>
具體案例以后具體分析。
數據流,這個最重要的
看上面的圖,可以看到數據流發生改變的時候,數據是如何流動的。
單向數據流調用<code> store.dispatch(action) -> reducer(state, action) -> store.getState()</code>
(1)調用sote.dispath(action)(這里的action和上面提到的action不是一個概念,這個是一個純的對象,上面是一個action creator)
{ type: 'LIKE_ARTICLE', ID: 1 }
你可以在任何地方調用 store.dispatch(action),比如組件內部,Ajax 回調函數里面等等。
(2)Action 會觸發給 Store 指定的 rootreducer
rootreducer會返回一個完整的狀態樹,state狀態樹上的各個值都可以由對應的reducer來更新。
(3)store會保存狀態樹
更新完state后,新的 State 會替代舊的 State。然后可以添加監聽函數<code>store.subscribe(listener)</code>在回調函數里面可以通過<code>store.getState()</code>來獲取新的state。這樣就能更新整個UI。只要調用<code>dispath</code>,state就會根據<code>reducer</code>對應更新,進而觸發監聽函數<code>subscribe</code>,然后觸發回調函數渲染UI。