我在其他问题中看到了有关在行动中使用getState
是否可接受的相互矛盾(或者只是令我感到困惑)的答案,而且我已经看过很多次被称为反对-图案。对我来说,它似乎工作得很好,但如果我们不使用getState
,这样做的最佳做法是什么?
我在thunk中使用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;
}
}
我的reducer中使用的初始帐户状态只是:
account: {
initialized: false,
authenticated: false,
},
accountCheck
操作将用户(使用getState
和findByUID
函数找到)传递到accountLogInSuccess
,其中reducer通过{将其值添加到当前帐户状态{1}}。
首选不必将用户放在我的应用程序的根目录,然后通过props传递它,在Redux中实现此目的的最佳做法是什么,并且状态中的用户数据是否可用?同样,在thunk中使用Object.assign
到目前为止对我来说非常有用,但有没有更好的解决方案,这被认为不是反模式?
答案 0 :(得分:25)
我写了一篇名为Idiomatic Redux: Thoughts on Thunks, Sagas, Abstraction, and Reusability的扩展博客文章,详细介绍了这一主题。在其中,我回应了几个关于thunk的批评和getState
的使用(包括Dan {@}在Accessing Redux state in an action creator?中的评论)。事实上,我的帖子特别受到像你这样的问题的启发。
作为TL;我的帖子的DR:我相信thunks是一个在Redux应用程序中使用的完全可行的工具,并鼓励使用它们。虽然在使用thunk和sagas以及在其中使用getState/select
时需要注意一些有效的问题,但这些问题不应该让你远离使用thunk。