2017-06-02 76 views
2

會在傳入動作中添加回調action.data會出現任何錯誤/反模式(按照'思考反應/還原')嗎?向Redux Reducer添加回調

// reducer 
ACTION_FOR_REDUCER() { 
    var x = 123 
    if (action.data.callback) action.data.callback(x) 
    return { 
    something: action.data.somedata 
    } 
}, 

再後來訪問該數據在App時動作被調用(在一個容器也許)

// later in the app 
this.props.dispatch(changeSomething({ 
    somedata: somedata, 
    callback: (x) => { console.log(x) } 
}))  

回答

3

這個想法沒有錯,執行是。

而不是添加回調,從行動中返回一個承諾(您需要redux-thunk中間件或一些類似的選擇)。

然後,你可以簡單地做:

dispatch(myAction).then(callback); 

當然,你也可以簡單地派遣在回調另一個動作,通常最終成爲一個複合動作。

const myAction = ... 
const callbackAction = ... 

const compoundAction =() => dispatch => { 
    dispatch(myAction()) 
     .then(() => dispatch(callbackAction())); 
}; 
5

終極版的第三原理(在introduction section of the docs列出)​​是「的變化是與純函數製成。

純函數是,它總是返回相同的結果給定相同的輸入,並且不會引起任何副作用的功能。有一個回調日誌最明顯的東西將是一個副作用!

The docs go on to say:

這是非常重要的是,減速保持純淨。在減速機內你永遠不應該做的事情:

  • 改變它的參數;
  • 執行API調用和路由轉換等副作用;
  • 調用非純函數,例如Date.now()或Math.random()。

這背後的原因是它使你的減速預見的 - 你知道,由於具有一定的有效載荷的動作,你保證有相同的輸出。這使得你的應用程序都更容易理解作爲一個開發者,並更容易進行單元測試。

如果要執行的副作用時的動作發生,你應該安裝一箇中間件,它允許你這樣做 - 它們的一些常見的例子有:

  • redux-thunk,它允許你調度功能反過來又能調度操作(通常用於製造API調用)
  • redux-logger,它允許你註銷分派的行動。
  • redux-devtools-extension,它允許您查看在Chrome擴展devtools你的狀態和行爲。

如果你不能找到一箇中間件組件,做你所需要的(罕見的,說實話 - !有很多在那裏的話),你可以write your own很容易。

+0

如果你想調用一些外部的API,我會建議創建自己的'middleware' – Ematipico

+0

@Ematipico:將在中間件增加一些細節來回答:) –

+0

謝謝,我覺得終極版-thunk是什麼,我正在尋找。關於變異這個問題,是不是後來作爲'dispatch'的一部分發生的突變,而不是在reducer本身中呢? –

0

回調引入了副作用,所以當使用Redux時,您應該考慮返回一個新狀態,例如done: true標誌,並對componentDidUpdate作出反應。

對於管理異步和效果,您可以使用redux-saga,redux-thunk,RxJs或其他庫。 如果你想堅持回調,爲什麼還要用終極版費心呢?