在 Redux Thunk 中使用 getState 是好的做法吗?



我在这里的其他问题中看到过相互矛盾(或者对我来说只是令人困惑)的答案,关于在操作中使用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;
}
}

我的化简器中使用的初始帐户状态仅为:

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

accountCheck操作将用户(使用getStatefindByUID函数找到)传递到accountLogInSuccess中,化简器通过Object.assign将其值添加到帐户的当前状态。

希望不必将用户置于应用程序的根目录,然后通过 props 将其传递下来,在 Redux 中完成此操作并使用户数据在状态中可用的最佳做法是什么?同样,到目前为止,在 thunk 中使用getState对我来说效果很好,但是有没有更好的解决方案不被认为是反模式?

我写了一篇名为Idiomatic Redux: Thoughts on Thunks, Sagas, Abstraction, and Reusability的扩展博客文章,详细讨论了这个主题。 在其中,我回应了对笨蛋和getState使用的批评(包括 Dan Abramov 在动作创建者中访问 Redux 状态的评论? 事实上,我的帖子是专门受到像你这样的问题的启发。

作为 TL;我帖子的DR:我相信thunks是用于Redux应用程序的完全可行的工具,并鼓励使用它们。 虽然在使用 thunks 和 sagas,以及在它们内部使用getState/select时,有一些合理的顾虑需要注意,但这些问题不应该吓跑你不要使用 thunks。

相关内容

  • 没有找到相关文章

最新更新