【问题标题】:Loading screen during render (asynchronous rendering)渲染期间加载屏幕(异步渲染)
【发布时间】:2017-01-13 12:07:25
【问题描述】:

我有一个复杂的组件,即渲染几秒钟。该组件包含带有很多项目的大画布。在等待这个Print 组件的过程中,有什么办法可以渲染一些图标吗?

render(){
  const {data} = this.props;
  return(
    <Page>
      <div className="item column-3" id="graphColumn">
        {this.state.loading ? <img src={loadingIcon}/> : false}
        <div className={this.state.loading ? "hidden" : "visible"}>
          <Print channels={this.state.channels} readyToRender={this.readyRender.bind(this)}/>
        </div>
      </div>
    </Page>
  )
}
readyRender(){
  this.setState({
    loading: false
  })
}

我尝试在渲染过程中设置display:none,然后在componentDidMount 中设置Print 组件设置display:auto,但这不起作用。它也需要很长时间。有什么解决办法吗?

【问题讨论】:

  • 你能显示更多代码吗?

标签: reactjs asynchronous rendering


【解决方案1】:

有很多方法,但可能不是你所希望的。

React 同步执行其渲染,这意味着没有其他东西可以并行运行。但是,如果您可以控制何时会执行耗时的渲染,则可以预先添加等待图标。

这是一个例子:

var Demo = React.createClass({
  getInitialState: function() {
    return {loading: true};
  },
  componentDidMount: function() {
    setTimeout(() => {
      this.setState({loading: false});
    }, 1000);  //delay this to allow React to actually render the initial state. Can be set to just 10ms, but then font-awesome css doesn't load in time from CDN.
  },
  render: function() {
    if(!this.state.loading) return <div>{this.simulateSlowRender()}</div>;
    return <div><i className="fa fa-spinner fa-spin fa-fw" aria-hidden="true"></i> loading...</div>;
  },
  simulateSlowRender: function() {
    let arr = new Array(10000000);
    arr.push("done!");  //the last item prints "done".
    return <div>{arr.map((item) => item)}</div>;
  }
});

ReactDOM.render(
  <Demo />,
  document.getElementById('container')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />

<div id="container"></div>

警告:请注意,这将“挂起”您的整个应用程序,直到渲染完成。 Javascript 动画在这段时间内不太可能工作。

【讨论】:

  • 听到这个消息很难过。是的,我可以控制何时执行耗时的渲染,但是如果我可以在其中显示一些 gif/动画图标会很好:/
  • 嗯,你可以使用 css 来制作动画,如上面的 font-awesome 图标所示。 Javascript 动画虽然不起作用。
  • css 动画会起作用吗?因为我尝试了 gif,当组件在 10 秒后渲染时,gif 动画停止了..
  • 你可以下载font-awesome,它也有一个字体文件夹,或者像我一样添加外部样式表文件(检查我代码中的&lt;link&gt;标签)。
  • 非常感谢!这对我来说是可以接受的解决方案
猜你喜欢
  • 2020-11-23
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 2019-02-15
相关资源
最近更新 更多