为什么存在此错误:"Invariant Violation: Cannot update during an existing state transition"

Why does this error exist: "Invariant Violation: Cannot update during an existing state transition"

我似乎 运行 在一个大型应用程序中遇到了这个错误(但我不确定在哪里):

Uncaught Error: Invariant Violation: setState(...): Cannot update during an existing state transition (such as within render). Render methods should be a pure function of props and state.

我怀疑这可能是在 setTimeoutsetInterval 中使用 setState 的结果。

这引出了我真正的问题:为什么会出现这个错误?是否有一些概念上的原因我错过了为什么 ReactJS 不只是排队状态和道具更改?我猜是否有原因,它与应用程序复杂性有关 and/or 避免竞争条件...

我的下一个问题是:在 React 之外(例如在某些异步事件期间)更新组件的正确方法是什么,以便不会发生此错误?

编辑:

在进一步深入研究这个问题之后,罪魁祸首似乎实际上是我正在使用的底层平台(ElectronJS,正式名称为 Atom Shell)。基本上,ElectronJS 将 Chromium 和 NodeJS 结合在一起。我正在使用 NodeJS API 做一些异步的事情,当它完成时,ElectronJS 会 return 回到它停止的调用堆栈,完全绕过事件循环,从而导致竞争条件使用 React.

实现此目的的一种方法是使用 Flux 模式并让您的超时触发商店中的更改。这将导致更改作为其生命周期的一部分传播到感兴趣的组件。

问题是 setState 会导致重新渲染(可能取决于 shouldComponentUpdate)。如果您在 render 函数中有一个 setState 调用,它会触发另一个渲染。您可能会陷入重新渲染的无限循环。没有什么可以阻止您使用 setState 作为某些异步操作的结果(事实上这很常见)。只要它不在状态更新时 运行 的组件的 render 或其他生命周期方法中就没问题(shouldComponentUpdate 是另一个,因为你最终会得到一个以同样的方式无限循环)。