我正在使用Redux管理我的应用状态,并且我使用redux-thunk
进行了异步操作。
export const login = credentials => dispatch => {
return doLogin(credentials).then(token => {
localStorage.setItem('token', token)
// this dispatch call was there before, but now it has gone,
// because it is not necessary anymore
// dispatch({ type: LOGIN_SUCCESS })
})
}
问题是,现在我有一个不会将任何操作发送到商店的操作,只是执行有关登录和存储令牌的工作。
可以采取这种行动吗?我对这段代码并不十分自信,但我不知道如何让它更好。
答案 0 :(得分:4)
您要求就没有严格规则的事情征求意见,但经验法则是行动应该是对应用程序中发生的事情的最小描述。
一般来说,Thunkified行为是这种行为的一种解决方法,但是在这种情况下可以采取这种行动,因为即使它没有通过reducer对Redux状态产生影响,你和&# #39;重新使用(thunk)中间件来执行副作用,而中间件则用于响应操作。
您正在触发上游'下游减速器没有消耗的动作并不重要,尽管在开始时dispatch({ type: 'LOGIN_REQUEST' })
和最后dispatch({ type: 'LOGIN_SUCCESS'})
可能是一个好习惯,下游也是如此应用程序有一种方法可以知道如果它想要稍后对它做些什么会发生什么。
答案 1 :(得分:4)
没有规则,你不一定需要发出任何行动,但行动创造者根本不会发出任何行动感到尴尬。
如果您真的不需要发送任何操作,那么该组件可能根本不应该连接到Redux。动作创建者应该发送动作,如果它没有,它不是动作创建者,它是一个功能。您可以使用本地函数创建一个简单的组件,而无需为Redux增加复杂性。
但是如果你想将它连接到Redux,那么拥有一个不创建动作的动作创建者几乎没有任何意义。调度操作是操作创建者的目的。
尝试考虑您在问题中提供的此示例中的用户体验。您可以使用动作创建器将令牌存储在本地存储中,或者甚至更好地使用中间件存储,但是您仍然需要发送一些操作以让您的应用程序了解正在进行的操作,以便它可以正常运行,让您的用户也知道发生了什么。例如,我可以在这里清楚地看到3个动作的空间:
即使您在登录后没有将用户路由到另一个页面,也可能需要在屏幕上更改某些内容,以便让用户知道登录已成功运行并显示退出选项。并且调度操作让reducer处理应用程序的状态变异是Redux的方法。
答案 2 :(得分:2)
这是品味的问题,但我个人并不认为你的动作创作者与其效果(在本地存储中设置的项目)紧密相关。
相反,我会发送一个动作,例如带有令牌的LOGIN_SUCCESS作为其数据传入。然后让中间件处理该操作类型 - 即在本地存储中设置令牌。
这样,在处理doLogin返回的凭据方面,您可以获得更大的灵活性。你应该追求每个软件的这种范例,做自己的事情并做到最好。所以你有一个功能来验证用户,然后将身份验证令牌交给另一个最了解如何处理它的部分。