2016-04-22 80 views
6

我已經看到分離動作和縮減器的論點,因爲它們有多對多的關係。爲什麼單獨操作+ reducer在Redux中?

我不認爲這實際上適用於Redux。由於只有1個數據存儲區,因此對還原器的操作應該是1對多的。

典型的reducer適用於特定數據存儲的特​​定更改。

MY_ACTION = "MY_ACTION" 
function reducer(state, action) { 
    switch(action.type) { 
     case MY_ACTION: // stuff with my action to create new state 
     default: return state 
    } 
} 

我們可以結合多個減速帶combineReducers爲什麼不能定義處理程序與動作本身的操作。

例如

class Action { 
    constructor(type) { 
     this.type = type 
     this.handlers = [] 
    } 
    add_handler(handler) { 
     this.handlers += handler 
    } 
    get_reducer() { 
     reducer = combineReducers(this.handlers) 
     return (state, action) => { 
      if(action.type == this.type) { 
       return reducer(state, action) 
      } 
      return state 
     } 
    } 
} 

隨着「鴨子」的格局,我們最終把主減速器相同的模塊作爲行動宣言英寸

是否有任何理由讓Reduce +動作與redux分開?

+0

我不知道你在問什麼或說明。 – JMM

回答

3

將動作創建者與reducer函數分開的主要原因是reducer函數必須是純函數。如果您想在動作創建器中執行某些操作(例如異步API調用),則無法將其放入reducer中。關於這個here有一個很好的解釋。

+0

我可以補充說,你不希望你的reducer訪問ajax調用,服務/函數與sideeffects ..出於同樣的原因(他們應該是純粹的)。 動作創建者可以訪問服務,並創建所有他們想要的副作用。也許您的應用程序結構使得它太細意大利式樣,如果您將動作創建者和縮減器放在同一個地方。 具體而言,我的Angular2應用程序是模塊化結構,我不希望我的商店模塊能夠訪問任何服務等。 另一方面,動作創建者需要訪問各種服務,所以他們需要訪問更多... – Spock

相關問題