2017-04-06 14 views
12

私はアクション内getStateを使用することが許容であるか否かについては(私には、あるいは単に混乱)、ここで他の質問で回答が相反する見ている、と私はそれがアンチパターンと呼ばれているかなりの数回を見てきました。私にとっては、うまくいくようですが、getStateを使用しない場合は、これを行うためのベストプラクティスは何ですか?Redux Thunkの良い習慣でgetStateを使用していますか?

私はgetStateをサンクの中で使用しています。現在、いくつかの模擬データに接続され、アプリケーションの状態に引き込まれているユーザーの配列をフィルタリングします。ここで

は、自分の行動のためのコードです:

export const accountLogInSuccess = user => ({ 
    type: types.ACCOUNT_LOG_IN_SUCCESS, 
    user, 
}); 

export const accountLogOutSuccess =() => ({ 
    type: types.ACCOUNT_LOG_OUT_SUCCESS, 
}); 

export const accountCheckSuccess =() => ({ 
    type: types.ACCOUNT_CHECK_SUCCESS, 
}); 

export const accountCheck =() => (
    (dispatch, getState) => { 
     dispatch(ajaxCallBegin()); 
     return apiAccount.accountCheck().then((account) => { 
      if (account) { 
       const user = findByUID(getState().users, account.uid); 
       dispatch(accountLogInSuccess(user)); 
       toastr.success(`Welcome ${user.nameFirst}!`); 
      } else { 
       dispatch(accountLogOutSuccess()); 
      } 
      dispatch(accountCheckSuccess()); 
     }).catch((error) => { 
      dispatch(ajaxCallError(error)); 
      toastr.error(error.message); 
      throw (error); 
     }); 
    } 
); 

そして、私の減速:

export default function reducerAccount(state = initial.account, action) { 
    switch (action.type) { 
    case types.ACCOUNT_LOG_IN_SUCCESS: 
     return Object.assign({}, state, action.user, { 
      authenticated: true, 
     }); 
    case types.ACCOUNT_LOG_OUT_SUCCESS: 
     return Object.assign({}, { 
      authenticated: false, 
     }); 
    case types.ACCOUNT_CHECK_SUCCESS: 
     return Object.assign({}, state, { 
      initialized: true, 
     }); 
    default: 
     return state; 
    } 
} 

私の減速に使用するアカウントの初期状態はちょうどです:

account: { 
    initialized: false, 
    authenticated: false, 
}, 

accountCheckアクションがユーザを通過する(getStateと減速はObject.assignを介して、アカウントの現在の状態にその値を加算accountLogInSuccessに機能)。

私のアプリケーションのルートでユーザーを取得し、それを小道具で渡す必要はありません。これをRedux内で達成し、ユーザーデータを状態で利用できるようにするにはどうすればよいですか?繰り返しになりますが、サンクの中でgetStateを使用することはこれまでのところ素晴らしいことですが、アンチパターンとは見なされない優れた解決策がありますか?

答えて

12

私は詳細に、このトピックを扱っIdiomatic Redux: Thoughts on Thunks, Sagas, Abstraction, and Reusabilityと呼ばれる拡張されたブログの記事を、書きました。その中で、私はサンクのいくつかの批評に答えて、getState(ダン・アブラモフのコメントをAccessing Redux state in an action creator?に含む)を使用しています。実際、私の投稿はあなたのような質問から特別なインスピレーションを得ました。

私の投稿のTL; DR:サンクはReduxアプリケーションで使用するための完全に実行可能なツールであり、その使用を推奨しています。いくつかの有効な懸念がサンクとサガを使用して、それらの内部getState/selectを使用する際に注意することがありますが、これらの懸念は、サンクを使用してから離れて、あなたを怖がらせるべきではありません。

関連する問題