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

未捕获错误:不变冲突:setState(…):无法更新

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

这就引出了我真正的问题:为什么会存在这种错误?我不明白为什么ReactJS不只是队列状态和props 更改,有什么概念上的原因吗?我猜这是有原因的,它与应用程序的复杂性和/或避免竞争条件有关...

接下来我的问题是:在React之外(例如在某个异步事件期间)更新组件以避免发生此错误的正确方法是什么?

Edit:

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

推荐答案

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

React-native相关问答推荐

错误:无法解决模块missing-asset-registry-路径

ITMS—91053:缺少API声明—ReactNative

我们如何才能将我们自己的应用程序(IOS)排除在共享表中?

为什么当键盘出现在react native 时我的按钮会上升?按钮视图位置是绝对的?

React-Native-Web 错误:rnw_blogpost.bundle.js:1414 Uncaught TypeError: Cannot read properties of undefined (reading 'isBatchingLegacy')

如何在 React / React Native 中使用 Emscripten 编译的 JavaScript

react-redux connect 和 redux 数据的组件生命周期顺序

React Native 将 base64 图像保存到相册

加载作为props传递的图像

React Native:约束 Animated.Value

iPhone 6s plus 上的字体大小

Undefined 不是判断 this.state.* 的对象

有没有办法改变 IOS 标题上react-navigation 的默认后退按钮 colored颜色 ?

React Navigation TabNavigator:在选项卡更改时重置上一个选项卡

更改默认的 React Native 下拉箭头图标

React Native ScrollView 在snapping后重新回到顶部

如何将 Crashlytics 与 React Native 应用程序集成

是否可以在 react-native 的构造函数中调用异步函数?

我可以从react-native元素中删除 tvOS 吗?

将 setState 与 promise 一起使用后出现错误