关于在已卸载的组件

时间:2016-10-27 22:40:51

标签: reactjs react-router

警告:

Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op. Please check the code for the _class component.

知道它可以来自哪里。陷阱或类似的东西?

我已经查看了代码中的所有setState并将其替换为确保。无法找到它的来源......

到目前为止我的观察结果:

  • 仅在我的测试中发生
  • 浏览器没问题
  • 我以为自己还有更多...但是经过更多测试后我感到很困惑,因为它不符合我以为我理解的模式......

所以!我理解错误是什么,但这次警告是关于_class component所以我迷路了......我刚刚升级到react-router v4,它需要进行大量更改,因此很难将其本地化警告的来源。

之前有人遇到过类似的问题吗?

编辑: 我发现导致问题的setState。它在react-router-server。我会调查一下,看看能不能解决它!

感谢@zerkms,因为终端中没有跟踪,因此想要使用调试器来获取行号。

我使用了v8实验检查员(https://stackoverflow.com/a/39901169/3687661)。效果很好:))

2 个答案:

答案 0 :(得分:12)

由于API调用等异步活动,这种情况很常见。例如,当您尝试在从服务器接收数据并且未接收到该状态的相应页面之后设置状态时,会发生这种情况。

要避免这种情况,请在设置该组件中的状态之前检查组件是否已安装。使用标记进行检查,在List<Wrapper<Wrapper<?>>> ls1 = new ArrayList<>(); And Wrapper<Wrapper<?>> l1 = new Wrapper<>(new Wrapper<>(t)); ls1.add(l1); // OK 中说final String server="localhost/"; final String db_name="db_name"; final String userName="xxxx"; final String password="xxxx"; Connection myConn= DriverManager.getConnection("jdbc:mysql://"+server+db_name,userName,password); 并在this.mounted = true中将标记更改为false。在组件中使用componentDidMount来检查组件是否已安装。这将修复警告。

希望这有帮助!

答案 1 :(得分:10)

当您在xmlns:batch="http://www.springframework.org/schema/batch" this.setState或其他延迟功能中调用setTimeout时,通常会发生这种情况。

如果您使用setInterval / setTimeout,请务必在setInterval中致电clearTimeout / clearInterval