当前位置: 首页 > 面试题库 >

HTML脚本在React组件加载后加载

洪昱
2023-03-14
问题内容

我的index.html

<!DOCTYPE html>
<html lang="en">
    <head>

        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <meta name="google-signin-client_id" content= "my_client_id.apps.googleusercontent.com">

        <meta name="google-signin-scope" content="profile email">
        <script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script>
        <script>
            function start() {
                console.log('script running')
                gapi.load('auth2', function() {
                    auth2 = gapi.auth2.init({
                        client_id: 'my_client_id.apps.googleusercontent.com',
                        scope: 'profile email'
                    });
                });
            }
        </script>
    <title>React App</title>
  </head>
  <body>
    <div id="root"></div>


  </body>
</html>

在该start()函数中,我打印到控制台以查看其运行时间。

当我加载页面时,经常start() react组件 之后 加载。

Login.js

    componentDidMount() {
        console.log(gapi.auth2.getAuthInstance())
    }

在调试器中,您可以看到脚本正在组件之后加载

如果我刷新页面几次,则可以正常工作。但是有时它起作用,有时却不起作用。

为什么?


问题答案:

我认为在react中加载脚本的最好方法是使用容器组件。这是一个非常简单的组件,它允许您编写将脚本导入组件的逻辑,而不是index.html。您还将要通过在检入componentDidMount之后调用loadScript来确保不多次包含脚本。

改编自:https : //www.fullstackreact.com/articles/how-to-write-a-
google-maps-react-component/

这样的事情。。。

  componentDidMount() {
    if (!window.google) {
      this.loadMapScript();
    }
    else if (!window.google.maps) {
      this.loadMapScript();
    }
    else {
      this.setState({ apiLoaded: true })
    }
  }

  loadMapScript() {
    // Load the google maps api script when the component is mounted.

    loadScript('https://maps.googleapis.com/maps/api/js?key=YOUR_KEY')
      .then((script) => {
        // Grab the script object in case it is ever needed.
        this.mapScript = script;
        this.setState({ apiLoaded: true });
      })
      .catch((err: Error) => {
        console.error(err.message);
      });
  }

  render() {
    return (
      <div className={this.props.className}>
        {this.state.apiLoaded ? (
          <Map
            zoom={10}
            position={{ lat: 43.0795, lng: -75.7507 }}
          />
        ) : (
          <LoadingCircle />
        )}
      </div>
    );
  }

然后在一个单独的文件中:

const loadScript = (url) => new Promise((resolve, reject) => {
  let ready = false;
  if (!document) {
    reject(new Error('Document was not defined'));
  }
  const tag = document.getElementsByTagName('script')[0];
  const script = document.createElement('script');

  script.type = 'text/javascript';
  script.src = url;
  script.async = true;
  script.onreadystatechange = () => {
    if (!ready && (!this.readyState || this.readyState === 'complete')) {
      ready = true;
      resolve(script);
    }
  };
  script.onload = script.onreadystatechange;

  script.onerror = (msg) => {
    console.log(msg);
    reject(new Error('Error loading script.'));
  };

  script.onabort = (msg) => {
    console.log(msg);
    reject(new Error('Script loading aboirted.'));
  };

  if (tag.parentNode != null) {
    tag.parentNode.insertBefore(script, tag);
  }
});


export default loadScript;

我知道很多东西,但是当我第一次这样做的时候,当我发现有一种(相当)简单的方法将任何脚本包含在任何react组件中时,这真让我感到轻松。

编辑:其中一些我只是复制粘贴,但是如果您不使用create-react-app,则可能必须替换某些ES6语法。



 类似资料:
  • 问题内容: 我有以下脚本文件 我遵循这个在React /JSX中添加脚本标签的方法,)但是对我来说不起作用… 如何在我的react组件中加载脚本? 问题答案: 经过大量的研发,终于找到了解决方案。 我曾经 在React组件中加载脚本

  • 问题内容: 我想从CDN加载脚本,然后在React中执行该脚本公开的功能: 该脚本有时需要花费一些时间(通常是第一次)加载,并且何时调用“ foo”不可用,并且出现如下错误: TypeError:无法读取未定义的属性“ render” 如何确保脚本成功加载后调用? 问题答案: 根据React Component Specs和Lifecycle的说法,我认为在componentWillMount()

  • 我试图在一个网站上获得一个内容列表(若有人感兴趣的话,这一个)。布局最近发生了变化,现在他们不会一次加载所有内容,而是使用magic(可能是js)。我目前正在使用JSoup分析HTML,但我愿意接受建议。 这就是我得到的: 实现此目的的代码: 这是我想看到的(复制从检查元素后,页面加载了所有的内容): 谷歌帮不了什么忙,因为与微调器等相关的所有内容都与javascript有关。 解决方案: 由于J

  • 问题内容: 我正在考虑构建一个Web应用程序,人们可以在其中安装插件。我希望插件能够定义将呈现到页面的React组件,而无需在安装插件后重新编译主JavaScript包。 所以这是我正在考虑的方法: 使用webpack 将主要的JavaScript与React作为外部库捆绑在一起。 也让插件作者使用React作为外部库来编译其组件。 这样,我只运行一个React实例。我可能可以对其他一些经常使用的

  • 我必须将MathJax功能添加到我的应用程序中。 根据一些示例,要添加的正确脚本是 脚本从Asset目录中的本地文件夹加载。 当从文件系统上的另一个文件夹(私有应用文件夹)加载到Android WebView中时,我必须将该脚本添加到本地超文本标记语言文件中。 HTML页面中有数学公式,必须由MathJax函数读取。 在加载之前,我无法将脚本作为标记注入HTML文件。但是,公式的渲染也必须在加载后

  • 问题内容: 我试图找出如何加载和呈现基本HTML文件的方法,因此不必编写类似以下的代码: 问题答案: 我只是找到 了 使用fs库的 一种 方法。我不确定这是否最干净。 基本概念只是原始文件读取和转储内容。不过,仍然可以接受更清洁的选择!