[英]When exactly does React render — problem managing state between various async calls, socketIO and React
我正在使用React作为前端的MERN堆栈应用程序。 这是一款依靠socketIO来知道其他玩家何时移动的游戏,以便该游戏可以从数据库执行REST API调用,以允许React刷新游戏板。
它工作得很好,但是React应用偶尔似乎都不会收到socketIO消息,尽管据我所知,socketIO保证了交付。 这是一个很难复制的错误。 一个想法是,当消息到达时,React可能正在刷新,并且某种程度上搞砸了事情。 因此,我添加了一个标志,该标志在消息到达时设置为true
,并在加载更新的游戏时清除该标志,并将其置于React state
,从而(希望)刷新。 奇怪的是,当标志仍然为true
时,正在调用render
。 这是为什么?
用伪代码
this.state = game
updateFlag = false
onSocketMessage => {
updateFlag = true
asyncGetNewGame
.then(game => {
updateFlag = false
this.setState({game})
})
}
render() {
log.debug(updateFlag) // is true, but why?
const {state:{game}} = this
<SomeComponent game={game}>
}
如上所述,该标志在渲染期间保持为true
,但我认为在异步调用下获取新游戏后,将标志的同步设置设置为false
会在渲染之前进行,因为据我所知,由state
字段game
的更改引起的,直到更改标志后才设置。
我是否正确理解时间表? 如果有人可以帮助阐明这一点,我将不胜感激。
好吧, setState
不是同步方法,因此,以前对其的任何调用都可能会触发呈现,而不一定是onSocketMessage
中的onSocketMessage
。 此外,对组件道具的修改可能会导致重新渲染。 如果要为updateFlag
遵循同步逻辑,建议您使用回调: setState(value, callback)
。
另外,还要注意从这句话在这里 :
除非shouldComponentUpdate()返回false,否则setState()将始终导致重新渲染。 如果正在使用可变对象,并且不能在shouldComponentUpdate()中实现条件渲染逻辑,则仅当新状态不同于先前状态时调用setState()才能避免不必要的重新渲染。
因此,如果您的逻辑依赖于渲染,则可能是错误的,因为其他情况可能会触发重新渲染。 是的,socket.io保证数据包/消息传递,但不能保证其他因素(例如逻辑,网络状态/配置)正常。 如果出现问题,建议您使用套接字客户端和服务器检查错误事件。
另外,如果您的逻辑取决于特定状态/属性值的更改,则应使用componentDidUpdate进行验证。
希望我能帮上忙。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.