1

私はReduxでアヒルを使用していますが、それは質問とは関係ありません。同じファイルにいくつかのアクション クリエーターがあり、一方を他方から呼び出したいと考えています (下の 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 関数の SWITCH で CASE ごとに二重にディスパッチせずに、open 関数内から close 関数を呼び出す方法はありますか?

二重ディスパッチとは、次のようなことを意味します...

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

可能であれば、close を 1 回だけ呼び出してから、指定された open を返したいと思います。

ティア!

4

1 に答える 1

3

redux-thunk のようなミドルウェアを使用する必要があります。ここにインストール手順がありますが、基本的にはストアをセットアップするときに適用する必要があります。

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;
    }
  }
}
于 2016-03-11T08:41:17.397 に答える