Является ли использование getState в Redux Thunk хорошей практикой?

Я видел противоречивые (или просто сбивающие с толку) ответы на другие вопросы, касающиеся использования getState допустимо или нет действие, и я не раз видел, как его называют анти-паттерном. Мне кажется, что это прекрасно работает, но что является лучшей практикой для этого, если мы не будем использовать getState?

я использую getState в thunk для фильтрации по массиву пользователей, которые в настоящее время подключены к некоторым фиктивным данным и находятся в состоянии приложения.

Вот код моего действия:

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 функция) в accountLogInSuccess где редуктор добавляет свои значения к текущему состоянию счета через Object.assign,

Если вы не хотите, чтобы пользователь находился в корне моего приложения, а затем передавали его через реквизит, какова лучшая практика для достижения этого в Redux и чтобы пользовательские данные были доступны в состоянии? Опять же, используя getState до сих пор внутри thunk отлично работает, но есть ли лучшее решение, которое не считается анти-паттерном?

1 ответ

Я написал расширенный пост в блоге " Идиоматическое Redux: мысли о Thunks, Sagas, Abstraction и Reusability", в котором подробно рассматривается эта тема. В нем я отвечаю на несколько критических замечаний и использования getState (включая комментарии Дана Абрамова в разделе "Доступ к состоянию Redux в создателе действия"?). На самом деле, мой пост был специально вдохновлен такими вопросами, как ваш.

Как TL;DR моего поста: я считаю, что thunks - абсолютно жизнеспособный инструмент для использования в приложениях Redux, и поощряю их использование. В то время как есть некоторые действительные проблемы, о которых следует помнить при использовании thunks и sagas и использовании getState/select внутри них эти проблемы не должны пугать вас от использования громов.

Другие вопросы по тегам