我是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。
答案 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