2017-05-30 5 views
3

私はReduxアプリケーションを作成しています(私の最初のものです)、アクション間のカップリングがどれほど適切かについては少し不明です。他のアクションに依存する/実行されたReduxアクション

私のアプリケーションには、URLに値がシリアル化されたいくつかのフォームがあります。

たとえば、特定の検索の入力フィールドがあり、キーアップするとurlパラメータが更新されます。このパターンに続くいくつかの入力フィールドがあります。 UPDATE_URLのようなアクションについて

// Within the declaration of a high-level component 
onForm1Change={(key, value) => { 
     // Listened to by "formValues" state cross-section reducer 
     store.dispatch({ 
      type: actions.FORM1_CHANGE, 
      key: key, 
      value: value 
     }); 

     // Listened to by "url" state cross-section reducer, leads to a url param update. 
     // Has it's own logic that is based upon the formValues state. 
     // Must run after FORM1_CHANGE finishes 
     store.dispatch({ 
      type: actions.UPDATE_URL, 
      formValues: store.getState().formValues 
     }); 
    } 
} 

何かが右に感じることはありません:私のトップレベルindex.js

は、私は次のようになり、コードのいくつかのブロックを持っています。このアクションはそれ自体ではありません。最初にディスパッチされる他のアクションに依存します。

コードの匂いのアクション間のカップリングのこの種ですか?これらのアクションを分離/リファクタリングするための共通のテクニックはありますか?

+0

派遣の主な目的は、ストア内の状態を変更することです。 UPDATE_URLアクションは、ストア自体から来るデータを送信しているので意味をなさないため、何も変更されません。 –

+0

@DJ。私はおそらくこれについてはっきりしていなかったかもしれませんが、UPDATE_URLを待ち受ける減速機は単にデータを渡すだけではありません。渡されたformValuesを入力として使用する独自のロジックが必要ですこれを反映するコードコメント) –

答えて

3

私はそれが完全に同期アクションを連鎖させる方法だと思います。この目的のために、redux-thunkのようなミドルウェアを使用することもできます(アクションディスパッチャー関数をアクションクリエータとして保存するため)。このトピックに関するいくつかはarticleです。

1

これは私が

は、任意の派遣アクションがqueryString性質を持っているかどうかを検出し、それにURLを更新しますReduxのストアミドルウェアを定義し、それをやった方法です。次に、あなたのアクションで

import createHistory from "history/createBrowserHistory"; 

function queryStringMiddleware(history) { 
    return store => next => action => { 
    const { payload } = action; 
    if (payload.queryString) { 
     history.push({ 
     search: queryString 
     }); 
    } 
    next(action); 
    }; 
} 

const history = createHistory(); 
const middlewares = [queryStringMiddleware(history)]; 
const store = configureStore({}, middlewares); 

const onForm1Change = (key, value) => { 
    store.dispatch({ 
    type: actions.FORM1_CHANGE, 
    key: key, 
    value: value, 
    queryString: "?the=query" 
    }); 
}; 
関連する問題