为什么会出现此错误:"不变违规:在现有状态转换期间无法更新"

jam*_*slk 14 javascript reactjs react-native

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

未捕获错误:不变违规:setState(...):在现有状态转换(例如内部render)期间无法更新.渲染方法应该是道具和状态的纯函数.

我怀疑它可能是在setState内部setTimeout或使用内部的结果setInterval.

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

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

编辑:

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

Han*_*son 20

问题是setState会导致重新渲染(可能取决于shouldComponentUpdate).如果你setStaterender函数中有一个调用,它将触发另一个渲染.你可能最终会进行无限循环的重新渲染.没有什么可以阻止你使用setState一些异步操作(实际上它很常见).只要它不是在render状态更新上运行的组件的其他生命周期方法(shouldComponentUpdate另一种是以相同的方式结束无限循环),它就可以了.

  • 如何找到此错误发生的位置? (4认同)