分派动作后状态未更新

时间:2018-08-29 18:35:39

标签: reactjs redux

我是Redux的新手。我必须调度一个操作来更新应用程序的状态,然后使用 updated 状态来调用后端。我使用thunkMiddleware

const mapDispatchToProps = dispatch => bindActionCreators({
    login: (user) => dispatch => {
        dispatch(loginAction())
        console.log('user.loggedIn after loginAction dispatching is', user.loggedIn)
    }
}, dispatch)

我希望在调用dispatch我的状态(以及映射到该状态的所有道具)后的immediately会收到更新后的值。但是,这种情况不会发生:dispatch调用之后的代码仍会观察到 更新之前的状态(即,在我的示例中,false被打印到控制台)。 / p>

是设计使我即使分派一个动作来更新状态,也不会在同一函数中观察到更新后的状态?还是我做错了什么?预先谢谢你!

复制项目可用here

3 个答案:

答案 0 :(得分:3)

其他两个注释至少部分不正确。

调度动作 默认情况下为100%同步,假设没有中间件拦截该动作并延迟该动作。 dispatch()返回时,存储状态已更新。 @ageoff的示例是正确的,因为您可以在分派后再次在重击中调用getState()并查看更新后的状态。

您的代码示例中有两个问题。

首先,在分派之后,React没有机会进行重新渲染,因此组件的道具不会发生变化。

第二,您的化简器应该响应该操作返回一个新对象,因此现有的user对象将不是作为更新的引用。实际上,如果您正确地进行了不可变的更新,那么旧的user对象将永远不会发生变化。重新渲染组件时,它应该为props.user获取一个新值,并进行更改。

答案 1 :(得分:1)

如前所述,调度不是立即进行的。组件将不得不等待在下一次渲染中将道具发送给它。我建议将需要立即值的任何逻辑移入reducer本身:

export const loginAction = () => {
  return (dispatch, getState) => {
    //Do your login stuff
    getState().user.loggedIn // = false
    dispatch(setUserLoggedIn(true))
    getState().user.loggedIn // = true
    //Make my back end calls
  }
}

答案 2 :(得分:0)

dispatch是异步的,如果登录代码是可以返回的,则可以在该操作上调用.then,但是最好考虑一下您还能如何实现相同的目标。

文档链接提及

  

这是完全同步的。每次发送动作时,状态都会立即更新。

这可能是造成混乱的根源?即时更新是指您可以在组件或mapStateToProps

中观察到的下一个状态。