React Redux 如何处理循环中的连续变化
How does React Redux handle successive changes in a loop
如果我有一个在每个循环中分派 redux 操作的循环,React 和 Redux 如何处理更新连接的组件?如果每个 redux 动作都会单独导致某些组件的重新渲染,并假设每个循环都会将状态更新为具有新值,那么这些组件是否每次都在循环中重新渲染?
在循环中同步地挂钩组件的更新生命周期 运行,或者 React / Redux 在某处批处理预期的更改,然后在循环完成后更新一次?
根据我刚才的经验,似乎正在进行某种批处理,因为组件似乎只在循环结束时才更新,所有更改都会同时注册。
关于如何解决这个问题的任何想法?这意味着每次 redux 操作通过 reducer 并更改状态时,我都希望连接组件的 "componentWillReceiveProps" 方法为 运行。
起初我不确定 redux
所以我写下了我的想法作为评论。
我越想越觉得我们知道答案:
首先,React 的 setState
是异步的 DOCS
This form of setState() is also asynchronous, and multiple calls
during the same cycle may be batched together.
可是仔细一想,又怎么可能不是呢?
Js 只有 1 个线程,这个线程忙于你的循环,所以它无法自行释放它来调用 dispatch
或 setState
等代码
当你的循环完成后,这是所有 "disptaching" 和状态设置为 运行 的时间,这里令人惊奇的部分是它可以 "remember" 每个变量和对象的上下文和范围,感谢我们的好朋友闭包。
只是为了回答,否则,上面的回答是正确的。
运行 在 setInterval 中使用回调进行循环,保持任意间隔时间。回调应该增加循环计数器和 setState/dispatch-action
看来 React 更新确实是异步的,至少对于由更新 redux 存储引起的更改,更改是批处理的。看看该组件的循环 运行 setState 会发生什么会很有趣。无论如何,解决方案是使循环异步,如下所示(将不胜感激关于更清晰/更有效的异步循环方法的建议):
const iterable = [...]
const asyncLoop = (i) => {
if(!iterable[i]) return
const cycle = new Promise (resolve=>{
dispatchReduxAction(iterable[i])
resolve(i+1)
})
cycle.then((j)=>{
asyncLoop(j)
})
}
asyncLoop(0)
如果我有一个在每个循环中分派 redux 操作的循环,React 和 Redux 如何处理更新连接的组件?如果每个 redux 动作都会单独导致某些组件的重新渲染,并假设每个循环都会将状态更新为具有新值,那么这些组件是否每次都在循环中重新渲染?
在循环中同步地挂钩组件的更新生命周期 运行,或者 React / Redux 在某处批处理预期的更改,然后在循环完成后更新一次?
根据我刚才的经验,似乎正在进行某种批处理,因为组件似乎只在循环结束时才更新,所有更改都会同时注册。
关于如何解决这个问题的任何想法?这意味着每次 redux 操作通过 reducer 并更改状态时,我都希望连接组件的 "componentWillReceiveProps" 方法为 运行。
起初我不确定 redux
所以我写下了我的想法作为评论。
我越想越觉得我们知道答案:
首先,React 的 setState
是异步的 DOCS
This form of setState() is also asynchronous, and multiple calls during the same cycle may be batched together.
可是仔细一想,又怎么可能不是呢?
Js 只有 1 个线程,这个线程忙于你的循环,所以它无法自行释放它来调用 dispatch
或 setState
等代码
当你的循环完成后,这是所有 "disptaching" 和状态设置为 运行 的时间,这里令人惊奇的部分是它可以 "remember" 每个变量和对象的上下文和范围,感谢我们的好朋友闭包。
只是为了回答,否则,上面的回答是正确的。
运行 在 setInterval 中使用回调进行循环,保持任意间隔时间。回调应该增加循环计数器和 setState/dispatch-action
看来 React 更新确实是异步的,至少对于由更新 redux 存储引起的更改,更改是批处理的。看看该组件的循环 运行 setState 会发生什么会很有趣。无论如何,解决方案是使循环异步,如下所示(将不胜感激关于更清晰/更有效的异步循环方法的建议):
const iterable = [...]
const asyncLoop = (i) => {
if(!iterable[i]) return
const cycle = new Promise (resolve=>{
dispatchReduxAction(iterable[i])
resolve(i+1)
})
cycle.then((j)=>{
asyncLoop(j)
})
}
asyncLoop(0)