`render` 和 `componentDidMount` 之间的存储竞争条件
Race Condition in Store between `render` and `componentDidMount`
在 componentDidMount
中设置商店侦听器而不同时调用 setState
或 forceUpdate
(从而触发立即重新渲染)是否安全?
在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
}
}
在 componentDidMount
中设置商店侦听器而不同时调用 setState
或 forceUpdate
(从而触发立即重新渲染)是否安全?
在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
}
}