`render` 和 `componentDidMount` 之间的存储竞争条件

Race Condition in Store between `render` and `componentDidMount`

componentDidMount 中设置商店侦听器而不同时调用 setStateforceUpdate(从而触发立即重新渲染)是否安全?

在React中常见的例子好像是在getInitialState同步Store状态或者在render监听前拉取Store数据,然后在componentDidMount开始监听。在 componentDidMount 中,是什么阻止了在呈现和设置侦听器之间的时间间隔内错过 Store 更改?

如果子组件在其 componentDidMount 中采取同步操作更改商店,父组件是否会错过此更改?

如果子组件在 componentDidMount 中发出异步操作,这是否有可能以父组件错过的方式更改商店?

React 组件生命周期中是否存在异步事件可以进入的空白?

来自抢占式异步编程的背景 javascript 中缺乏显式同步保护,而在合作异步编程中通常是不必要的,这真的让我感到不安。

在对源代码进行一些测试和挖掘后,我得出结论,在初始组件生命周期的任何地方都无法触发异步事件 (getInitialState -> componentWillMount -> render -> 子级 -> componentDidMount).

从子组件调用的可以更改 Store 的同步事件肯定会在父组件可以调用之前解决 componentDidMount 并且会导致视图和数据变得不同步。

我得出的结论是,不在 componentWillMount 中注册 Store 侦听器的唯一原因是它们不应该 运行 在同构应用程序的服务器上。在我看来,这不是充分的理由,因为它会按文档顺序注册侦听器(这可能会影响性能),并且有可能在初始渲染期间丢失对 Store 的同步更改。从概念上讲,这也是错误的地方。

我正计划在 componentWillMount 中注册我的听众并使用浏览器测试:

componentWillMount: function () {
  if (typeof window !== "undefined") {
    // register listener in browser only
  }
}