Redux动作创建者在另一个内部调用

时间:2016-03-11 06:10:11

标签: javascript redux react-redux

我在Redux中使用ducks,但这与问题无关。我在同一个文件中有几个动作创建者,我想从另一个中调用一个(希望无需为下面的SWITCH中的每个CASE双重调度):

...
export function closeAuthDialogs() {
  return {type: CLOSE_AUTH_DIALOGS}
}

export function openDialog(dialog) {
  // close any open dialogs
  dispatch => {dispatch(closeAuthDialogs())} // <--THIS DOES NOT GET CALLED!!!
  //open the one we need
  switch (dialog) {
    case 'login':
      return {type: OPEN_LOGIN}
    case 'register':
      return {type: OPEN_REGISTER}
    case 'forgot':
      return {type: OPEN_FORGOT}
    case 'change':
      return {type: OPEN_CHANGE}
    case 'profile':
      return {type: OPEN_PROFILE}
    default:
      return;
  }
}
...

打开工作正常,但关闭函数永远不会被触发。有没有办法在open函数中调用close函数而不对open函数的SWITCH中的每个CASE进行双重调度?

通过双重调度我的意思是......

return dispatch => {
  dispatch({type: CLOSE_AUTH_DIALOGS})
  dispatch({type: OPEN_SOME_DIALOG)}
}

如果可能的话,我只想调用一次关闭,然后返回指定的open。

TIA!

1 个答案:

答案 0 :(得分:3)

您需要使用redux-thunk之类的中间件。安装说明here但基本上您需要在设置商店时应用它:

const store = createStore(
  rootReducer,
  applyMiddleware(thunk)
);

这将允许您从动作返回一个功能。这样的事情应该这样做:

export function openDialog(dialog) {
  return (dispatch) => {
    dispatch(closeAuthDialogs());
    switch (dialog) {
      case 'login':
        return dispatch({type: OPEN_LOGIN})
      case 'register':
        return dispatch({type: OPEN_REGISTER})
      case 'forgot':
        return dispatch({type: OPEN_FORGOT})
      case 'change':
        return dispatch({type: OPEN_CHANGE})
      case 'profile':
        return dispatch({type: OPEN_PROFILE})
      default:
        return;
    }
  }
}