【发布时间】:2018-03-06 22:17:51
【问题描述】:
我想知道我的应用需要多长时间才能“准备好”让用户与之交互。应用加载的时间线包括以下内容:
- DOM 加载。
- 初始 React 渲染。
- 从各种
componentDidMount()s 触发的 HTTP 调用 - HTTP 调用返回。 Redux 状态使用 HTTP 响应进行更新。
- React 使用来自 HTTP 响应的新值呈现。
- 所有初始加载已完成。用户已准备好与应用交互。
在这个过程结束时,我想触发一个跟踪事件来记录window.performance.now() 的值。
我不确定最好的方法是什么。 React 的组件系统很好地解耦了 UI 的各个部分。在这种情况下,不幸的是,这意味着我不会有一个简单的地方来检查“是否所有内容都已使用新数据呈现”。
我尝试过或考虑过的事情:
- 寻找一个 React 生命周期钩子,它告诉我是否有任何孩子正在更新。像
componentOrAnyChildDidUpdate()这样的东西。我认为这不存在,并且可能与 React 哲学背道而驰。 - 通过
context将anyChildDidUpdate()生命周期钩子组合在一起,并使我的应用程序中的每个组件都成为辅助抽象基类的子类或包装在更高阶的组件中。这似乎很糟糕,因为context是 experimental API。 - 通过
store.subscribe()订阅 Redux 状态。更新 Redux 状态以明确记录是否所有 HTTP 调用都已返回。一旦所有的 HTTP 调用都返回了,并且 React 完成了重新渲染,那么我就知道要触发跟踪回调了。问题是知道 React 何时完成重新渲染。如果我的store.subscribe()回调保证在react-redux的回调之后同步执行,它将起作用。但事实并非如此。
在 React 中有没有好的方法来做到这一点?
【问题讨论】:
-
为什么不在一个 redux "APP_START" 操作中包含所有这些 API 调用?
-
一个 redux 操作本身是不够的。我想知道应用何时完成渲染以响应 redux 操作。
-
@NickHeiner 您可以在您的 redux 状态中跟踪所有自包含静态组件的列表,然后一旦您使用 3. 确定状态最终确定的点,您就等待每个跟踪的组件发送一个指示渲染完成的 redux 操作。
-
@NickHeiner 您是否使用任何 redux 中间件来捕获 HTTP 调用?比如
redux-promise、redux-saga等等?
标签: javascript reactjs web redux react-redux