reactjs - 为什么 React 组件渲染只完成一次,而 reduce-action 会多次更改状态?
问题描述
我有 React 组件,它连接到内部的WebSocket服务器componentDidMount
。
componentDidMount() {
const { connectWs } = this.props
connectWs(
true,
() => {},
() => {},
res => {
this.socketCallback(res)
},
)
}
socketCallback = payload => {
const { handleClaimSuccess } = this.props
const { horse_id, race_id } = payload
const data = {
'horseId': horse_id,
'raceId': race_id
}
handleClaimSuccess(data)
}
render() {
const { claimed } = this.props
return (
<div>
{claimed.map((data, index) => (
<div className="primary-text">
{ data.isPending ? 'PENDING' : 'COLLECTED' }
</div>
)}
<div>
)
}
服务器通过套接字发送 3 条消息,组件处理这些消息并将其发送到reducer以更新状态。这 3 条消息之间的时间差为 30-60 微秒。
'handleClaimSuccess': (state, { payload }) => {
if (payload) {
const { horseId, raceId } = payload
const updatedWinnings = state.userWinnings
const indexOfWinningInClaimed = findIndex(updatedWinnings.claimed, {
'horseId': horseId,
'race': {
'raceId': raceId
},
})
updatedWinnings.claimed[indexOfWinningInClaimed].isPending = false
return {
...state,
'userWinnings': updatedWinnings
}
}
return state
}
所有消息都会相应地更改状态,但组件仅呈现一次结果(在第一条消息之后)并忽略接下来的 2 条消息。
据我了解,它与小消息间隔有关,因为它适用于单个消息。
它如何处理所有 3 条消息并在每条消息之后呈现状态?
解决方案
我认为这是由于 React 的更新状态,react 只承诺它会更改数据。更新状态不是每次发送不同的数据都会更新,多次更新可以合并为一次,批量更新1次。在您的情况下,您将状态更新了 3 次,因此 react 将其合并为一个,并且只执行了 1 次。
来自 React 的文档
updateState 不会立即改变 this.state 而是创建一个挂起的状态转换。在调用此方法后访问 this.state 可能会返回现有值。无法保证对 updateState 的调用同步操作,并且可能会批处理调用以提高性能。
推荐阅读
- python - 在python中安装街机包的问题
- django - Django:来自另一个模型的参考模型字段
- d3.js - 是否可以使用 ElasticY 左轴和定义的右轴域?
- azure - Azure 数据工厂无法检索输出
- python - face_recognition 库需要很长时间执行,我也尝试使用 Numba 但我无法执行,如何优化以下代码?
- python - Python statsmodels Probit 和 Logit 产生错误,而 OLS 工作正常?
- c# - 如果在数组中找到 C# Linq 表达式,则从字符串中删除
- python - 如何对没有来源的图像进行网络抓取?
- python - 如何使 tkinter Toplevel 窗口依赖于另一个 Toplevel 窗口
- assembly - 我试图找出如何计算一组操作对特定 CPU 和 I/O 设备需要多少 CPU 周期