Является ли использование 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
внутри них эти проблемы не должны пугать вас от использования громов.