【问题标题】:Render script tag in React Component在 React 组件中渲染脚本标签
【发布时间】:2019-05-17 05:44:42
【问题描述】:

我正在制作一个 React 应用程序,我只需要在一个组件中运行 Javascript 脚本,并引用 div 之一。

我知道有一些库可以这样做,但我想知道是否有更直接的方法可以做到这一点。现在我这样做:

import React, { Component } from "react";
import "../ThisComponent.css";

export default class MyComponent extends Component {
  render() {
    return (
      <div>
        <div id="scriptTarget" />
        <div className="main">
          // Other stuff
        </div>
        <script src="js/myScript.js" />
      </div>
    );
  }
}

但是什么也没发生。脚本存储在public/js/myScript.js.
谢谢!

【问题讨论】:

  • 你为什么不import脚本,然后调用它来触发它在来自componentDidMount的div上的行为?
  • 如果他想将脚本标签添加到该特定元素,则上述答案将不起作用。

标签: javascript reactjs jsx


【解决方案1】:

我终于在渲染组件之前通过添加componentDidMount函数解决了这个问题。像这样:

import React, { Component } from "react";
import "../ThisComponent.css";

export default class MyComponent extends Component {
  componentDidMount() {
    const script = document.createElement("script");

    script.src = "js/myScript.js";
    script.async = true;

    document.body.appendChild(script);
  }

  render() {
    return (
      <div>
        <div id="scriptTarget" />
        <div className="main">
          // Other stuff
        </div>
      </div>
    );
  }
}

如果有人有更好的解决方案,请随时分享。我会注意进一步的建议。

【讨论】:

    【解决方案2】:

    通过使用dangerouslySetInnerHTML,您可以将任何您想要的有效html 添加到您的元素中。

    import React, { Component } from "react";
    import "../ThisComponent.css";
    
    export default class MyComponent extends Component {
      render() {
        return (
          <div dangerouslySetInnerHTML="<script src='js/myScript.js' />" >
            <div id="scriptTarget" />
            <div className="main">
              // Other stuff
            </div>
          </div>
        );
      }
    }
    

    我应该提一下,正如属性名称所暗示的那样,强烈建议不要使用它。

    【讨论】:

      【解决方案3】:

      export default class MyComponent extends Component {
          componentDidMount() {
              const script = document.createElement("script");
              script.innerHTML = "window.onload = function() {\n" +
                  ...
                  "}"
              script.async = true;
              document.body.appendChild(script);
          }
      
          render() {
              return (
                  <div>
                  </div>
              );
          }
      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-11
        • 1970-01-01
        • 2021-06-07
        • 2017-12-17
        • 2021-08-25
        • 2019-08-09
        • 1970-01-01
        相关资源
        最近更新 更多