create-react-app:如何在 React 渲染之前加载 html

Posted

技术标签:

【中文标题】create-react-app:如何在 React 渲染之前加载 html【英文标题】:create-react-app: how to load html before React renders 【发布时间】:2019-08-10 04:02:01 【问题描述】:

我正在尝试在 React 加载之前添加启动画面。

因为我使用的是 react scripts / react-app,所以我的 index.tsx 只有这一部分:

ReactDOM.render(<App />, document.getElementById("root"));

我尝试在同一页面上添加我自己的 div,但它没有显示。

我想在反应加载之前在 1 秒计时器上显示一个带有初始图像的简单空白屏幕,以避免/隐藏渲染元素的移动。

** 如果我在 app.tsx 中添加屏幕,则在屏幕加载之前发生转移

更新

正如 Rishabh 在下面指出的,index.html 位于 /public 文件夹中。所以我最终结合了两种方法。

    在反应开始之前添加一个屏幕:

    <div id="root">
      <div id="dimScreen">
        <img src="/img/logo.png" />
      </div>
    </div>
    
    2.

在 0.5 - 1 秒内加载合适的加载器非顶部

class App extends Component 
    state = 
        loading: true
    
    componentDidMount() 
        setTimeout(() => 
            this.setState( loading: false );
        , 1000);
    
    render() 
        return (
            <React.Fragment>
                
                    this.state.loading ?
                        <Loader />
                        : (
                            <div className="app">
                                <Header />
                                <MyComponent />
                            </div>
                        )
                
            </React.Fragment>
        );
    

到目前为止,这种方法效果最好,但如果我发现问题或更好的东西会更新

【问题讨论】:

转移是什么意思?为什么你的状态中没有类似 isLoading 的变量并有条件地渲染你的应用程序?就像它正在加载然后显示 null 或启动屏幕,一旦你准备好所有的东西就显示完整的应用程序? 本文第二个解决方案中的 sn-p 可能也有帮助:***.com/a/40989121/9598077 【参考方案1】:

因此,只需转到公用文件夹和内部的 index.html 即可

&lt;div id="root"&gt;&lt;-- Add Splash screen html code here --&gt;&lt;/div&gt;

添加您的启动屏幕代码,当 react 加载时,它会将 div 内的所有内容替换为 id root

【讨论】:

没有 index.html。这是一个生成 index.tsx 的反应应用程序。我已经尝试在我的问题中添加我的启动页面 值得一提 - 如果您正在构建 PWA 并希望在 index.html &lt;div id="root"&gt; 中包含图像,请使用 SVG 或将图像转换为 base64 并使用数据 URI。这可确保图像最终出现在自动生成的预缓存清单中,因为数据直接嵌入到 index.html 中,而不是单独的图像文件中。【参考方案2】:

这是一个使用statesetTimeout() 显示加载器五秒钟的示例,您可以使用splash screen component 代替&lt;Loader/&gt;

import React,  Component  from 'react';

import Drawer from '../Drawer/Drawer';
import Loader from '../../components/UI/Spinner/Loader/Loader';

class App extends Component 
  state = 
    loading: true
  

  componentDidMount()
    setTimeout(() => 
      this.setState(loading: false);
    , 5000);
  

  render()   
    return (
      <React.Fragment>
        
          this.state.loading ? <Loader />: <Drawer />
        
      </React.Fragment>
    );
  


export default App;

希望对你有帮助!

【讨论】:

到目前为止,这比我的 html 加载器好得多!【参考方案3】:

我不确定这是否会起作用,它没有经过测试,但也许它会引导您走向正确的方向?所以,这是我的 2 美分

withSplash.js

const withSplash = MyAppComponent => 
  class extends React.Component 
    state = 
      showSplash: true
    

    componentDidMount () 
      handleSplashComponent(); 
    

    componentWillUnmount () 
      if (this.timer) 
        this.timer = null;
      
    

    handleSplashComponent = () => 
      this.timer = setTimeout(()=> 
        this.setState(
          showSplash: false
        )
      , 3000)
    

    render () 
      return this.state.showSplash
        ? <SplashComponent />
        : <MyAppComponent />
    
  

App.js

class App extends Component 
  ...


export default withSplash(App);

AnotherComponent.js

class AnotherComponent extends Component 
  ...


export default withSplash(AnotherComponent);

【讨论】:

谢谢!我尝试了这条路线,但到反应代码执行时为时已晚。我需要更直接的东西。 index.html 中的解决方案效果很好 实际上 index.html 解决方案仍然是生涩的 :( 我现在试试你的方法 嘿嘿还没有具体尝试过,因为另一个类似并且有效,但看起来它会起作用!

以上是关于create-react-app:如何在 React 渲染之前加载 html的主要内容,如果未能解决你的问题,请参考以下文章

使用 create-react-app 在 npm 运行构建时出错

在 Heroku 上配置单页 Create-React-App

无法在 create-react-app 中使用 css 模块

create-react-app 上的 node-sass 问题

react菜鸟经验

由于某种奇怪的原因,我无法初始化 create-react-app