首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >知道UI何时在React / Redux中就绪

知道UI何时在React / Redux中就绪
EN

Stack Overflow用户
提问于 2017-09-25 20:37:24
回答 6查看 2.4K关注 0票数 19

我想知道我的应用程序需要多长时间才能“准备好”让用户与其交互。应用加载的时间线包括以下内容:

  1. DOM加载。
  2. 初始反应渲染。从各种componentDidMount()s
  3. HTTP调用触发的
  4. HTTP调用返回。Redux状态通过HTTP responses.
  5. React呈现来更新,其中包含来自HTTP responses.
  6. All的新值。初始加载完成。用户已准备好与应用程序进行交互。

在这个过程的最后,我想触发一个跟踪事件来记录window.performance.now()的值。

我不确定做这件事最好的方法是什么。React的组件系统在解耦UI的各个部分方面做得很好。在这种情况下,不幸的是,这意味着我没有一个简单的地方来检查“一切都用新数据呈现了吗”。

我尝试过或考虑过的事情:

  1. 寻找一个React生命周期钩子,它可以告诉我是否有子级在更新。就像componentOrAnyChildDidUpdate()一样。我认为这并不存在,它可能与React philosophy.
  2. Hack通过contextanyChildDidUpdate()生命周期钩子相悖,它使我应用程序中的每个组件要么子类成为助手抽象基类,要么被包装在更高阶的组件中。这似乎很糟糕,因为context是通过store.subscribe()连接到Redux状态的experimental API.
  3. Subscribe。更新Redux状态以显式记录是否所有HTTP调用都已返回。一旦所有的HTTP调用都返回了,并且React完成了重新渲染,我就知道要触发跟踪回调了。问题是知道React何时完成重新渲染。如果我的store.subscribe()回调保证在react-redux回调之后同步执行,它就能工作。但事实并非如此。

在React中有没有好的方法可以做到这一点?

EN

回答 6

Stack Overflow用户

发布于 2017-10-06 15:15:17

我担心在React中没有一个通用的好方法来做到这一点,这是与你的应用程序的结构相关的“逻辑”。

我想在react编写的单页面应用程序(SPA)中从一个页面导航到另一个页面时显示一个加载器,但我遇到了一个类似的问题,我不知道何时停止显示它,以及新页面中的所有组件是否都已完成其API调用/呈现。

我解决这个问题的方法是:

1)我从组件内部删除了所有的API调用。

2)创建一个Page组件来包装该页面中包含的所有组件(由您的react路由器调用)。

3)在导航时同时执行组件所需的所有请求(在我的示例中,显示加载器时)。对于完成的每个请求,创建一个promise,并在其中使用React.createElement动态创建您的组件。传递给创建了请求响应和promise处理程序的组件作为props。

4)解析组件componentDidMount中的promise。

5)一旦所有的承诺都解决了,你就知道“页面”已经准备好了,你可以记录window.performance.now()的值了。

在没有大量脱离上下文的代码的情况下,很难提供最小的代码示例,因为这些代码分布在整个应用程序中。

票数 1
EN

Stack Overflow用户

发布于 2017-10-06 15:37:50

有不止一种方法可以做到你所要求的--但在我的脑海中,我会这样做:

·在我创建redux存储并将值添加到初始状态之前,创建一个perf reducer并调用performance.now()

代码语言:javascript
运行
AI代码解释
复制
{ perf: { start: '...', end: '...' } }

·在已加载的reducer中跟踪初始HTTP请求的加载状态。

代码语言:javascript
运行
AI代码解释
复制
{ loaded: { request1: false, request2: false, request3: false } }

·将顶层组件连接到加载的reducer,并检查componentDidUpdate中的所有请求是否都已完成。如果为真,则将end值添加到perf reducer。

代码语言:javascript
运行
AI代码解释
复制
import React from 'react';
import { connect } from 'react-redux';

class App extends React.Component {
  componentDidUpdate(prevProps) {
    if (!prevProps.loadingComplete && this.props.loadingComplete) {
      this.props.updatePerf(performance.now());
    }
  }
}

const mapStateToProps = state => ({
  loadingComplete: state.loaded.every(item => item),
});

const mapDispatchToProps = dispatch => ({
  updatePerf(time) {
    dispatch({ type: 'SET_ENDING_PERF', payload: time });
  },
});

export default connect(mapStateToProps, mapDispatchToProps)(App);
票数 1
EN

Stack Overflow用户

发布于 2017-10-03 20:07:49

在我们的项目中,我们使用redux和几个动作-触发器,请求,成功,错误。

"Trigger“调用request并抛出loading: true到我们的”智能“组件"Request”中获取数据并将它们抛入成功/错误"Success“中,告诉我们一切正常且数据已加载并抛出{ loading: false,data }

在成功/错误时,我们总是知道应用程序正在发生这种情况

当然,您可以使用componentWillReceiveProps(nextProps) {}并检查组件中的加载标志和数据

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46413777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档