反应组件中的异步加载脚本

时间:2016-01-13 06:23:00

标签: reactjs

我在反应JSX中加载外部脚本时遇到问题

<script>
    (function(d) {
        var config = {
                kitId: 1234567,
                scriptTimeout: 3000,
                async: true
            },
            h=d.documentElement,t=setTimeout(function(){h.className=h.className.replace(/\bwf-loading\b/g,"")+" wf-inactive";},config.scriptTimeout),tk=d.createElement("script"),f=false,s=d.getElementsByTagName("script")[0],a;h.className+=" wf-loading";tk.src='https://use.typekit.net/'+config.kitId+'.js';tk.async=true;tk.onload=tk.onreadystatechange=function(){a=this.readyState;if(f||a&&a!="complete"&&a!="loaded")return;f=true;clearTimeout(t);try{Typekit.load(config)}catch(e){}};s.parentNode.insertBefore(tk,s)
    })(document);
</script>

这里是我的渲染函数,我希望javascipt加载asyn,它在html文件中非常简单,但是我在一个反应​​组件中被震惊了如何做到了实现。 (如果我可以避免安装另一个外部模块将是最好的)。非常感谢

render() {
    return (
        <head>
            //Script to load asyn
        </head>
    )
}

2 个答案:

答案 0 :(得分:3)

我的服务器渲染了最初的HTML文档,因此我无法像@mjhm建议的那样将其插入到头部。使用@bluebill1049的答案,我能够使用ES6模板字符串并做出反应dangerouslySetInnerHTML

import React, {Component} from 'react';

export default class Html extends Component {

  render() {
    const loadTypeKit = `
      (function(d) {

        var config = {
            kitId: 'YOUR_KITID', 
            scriptTimeout: 3000, 
            async: true
          },
          h=d.documentElement,
          t=setTimeout(function() {
            h.className=h.className.replace(/wf-loading/g,"")+" wf-inactive";
          },config.scriptTimeout),
          tk=d.createElement("script"),
          f=false,
          s=d.getElementsByTagName("script")[0],
          a;

        h.className+=" wf-loading";
        tk.src='https://use.typekit.net/'+config.kitId+'.js';
        tk.async=true;
        tk.onload=tk.onreadystatechange=function() {
          a=this.readyState;
          if(f||a&&a!="complete"&&a!="loaded") return;
          f=true;
          clearTimeout(t);
          try{
            Typekit.load(config)
          } catch(e){ }
        };
        s.parentNode.insertBefore(tk,s);

      })(document);
      `;

    return (
      <html>
      <head>
        <script dangerouslySetInnerHTML={{__html: loadTypeKit}} />
      </head>
      <body>
          ...
      </body>
      </html>
    );
  }
}

答案 1 :(得分:1)

dangerouslySetInnerHTML 是我找到的解决方案。

https://facebook.github.io/react/tips/dangerously-set-inner-html.html

这允许您拥有脚本标记并在jSX的一侧插入JavaScript。