36

getStateアクション内での使用が許容されるかどうかに関して、ここの他の質問で矛盾する (または単に混乱する) 回答を見てきました。私にとってはうまくいくようですが、使用しない場合、これを行うためのベストプラクティスは何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渡しfindByUIDます。accountLogInSuccessObject.assign

アプリケーションのルートでユーザーを取得し、小道具を介してそれを渡す必要がないことを好むのですが、Redux 内でこれを達成し、ユーザー データを状態で利用できるようにするためのベスト プラクティスは何ですか? 繰り返しgetStateますが、サンク内での使用はこれまでのところうまく機能していますが、アンチパターンとは見なされない、これに対するより良い解決策はありますか?

4

1 に答える 1

40

私はIdiomatic Redux: Thoughts on Thunks, Sagas, Abstraction, and Reusability というタイトルの拡張ブログ記事を書き、このトピックについて詳しく説明しています。その中で、サンクとサンクの使用に関するいくつかの批判に答えます(アクション クリエーターでの Redux 状態へのアクセスgetStateにおけるダン アブラモフのコメントを含む)。実際、私の投稿は、あなたのような質問に具体的に触発されました.

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

于 2017-04-06T16:20:26.463 に答える