运行redux thunk操作而不发送

运行redux thunk操作而不发送,redux,redux-thunk,Redux,Redux Thunk,我正在使用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 i

我正在使用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 })
   })
}
问题是,现在我有了一个操作,它不会将任何操作分派到存储中,只是完成登录和存储令牌的工作


这样做可以吗?我对这段代码不是很有信心,但我不知道如何让它变得更好。

您是在询问一些没有硬规则的东西的意见,但经验法则是,操作应该是对应用程序中发生的事情的最小描述

Thunkified actions通常是这种行为的一种解决方法,但在这种情况下,使用这种操作是可以的,因为即使它不会通过reducer对Redux状态产生影响,但您正在使用(thunk)中间件来执行副作用,中间件被设计为响应操作


事实上,您触发的“上游”操作不是下游减速器所使用的,这并不重要,尽管在开始时仍然
dispatch({type:'LOGIN\u REQUEST'})
dispatch({type:'LOGIN\u SUCCESS'})可能是一个好的做法
最后,这样下游应用程序就可以知道接下来要做什么。

这是品味的问题,但就个人而言,我不会将动作创建者与其效果(在本地存储中设置的项目)紧密结合起来

相反,我会发送一个操作,例如登录成功,并将令牌作为其数据传入。然后让一个中间件处理该操作类型,即在本地存储中设置令牌


这样,当涉及到如何处理doLogin返回的凭据时,您可以为自己购买更多的灵活性。你应该追求每一个软件都做自己的事情并做到最好的范例。因此,您有一个功能来验证用户,然后将身份验证令牌交给另一个最了解如何处理它的部件。

这方面没有规则,您不一定需要发送任何操作,但如果操作创建者根本不发送任何操作,则会感到尴尬

如果您真的不需要分派任何操作,那么该组件可能根本不应该连接到Redux。动作创建者应该分派动作,如果不分派,则不是动作创建者,而是函数。您可以使用本地函数创建一个简单的组件,而不必费心增加Redux的复杂性

但是,如果您想将其连接到Redux,那么让一个不创建任何动作的动作创建者是毫无意义的。分派动作是动作创建者设计的目的

在您在问题中介绍的示例中,尝试思考用户体验。您可以使用action creator或更好的中间件将令牌存储在本地存储中,但是您仍然需要调度一些操作,让应用程序知道发生了什么,这样应用程序才能正常运行,让用户也知道发生了什么。例如,我可以清楚地看到这里有3个动作的空间:

  • LOGIN_REQUEST:它将在存储中设置一个状态,让用户知道应用程序正在尝试登录,并禁用输入,这样应用程序就不会出现疯狂行为。请记住,在localhost中,API响应可能会立即发生,但在网络故障或服务器过载的情况下,这将需要更多的时间
  • LOGIN_SUCCESS:它会让应用程序知道令牌现在保存到本地存储中,用户可以路由到其主页,或者只更改当前页面的某些元素以指示成功登录
  • 登录失败:它会让用户知道凭据无效,并要求用户重试

即使您在登录后没有将用户路由到另一个页面,您也可能必须更改屏幕中的某些内容,以让用户知道登录已成功,并显示注销选项。调度操作让还原程序处理应用程序的状态变化是实现这一点的Redux方法。

这个函数对状态没有任何作用吗?关于中间件,您可能是对的。但localStorage仅用于该功能,因此我认为仅在这种情况下添加中间件会增加开销。总而言之,这是一个选择的问题。