【问题标题】:Adding JS script tag to React将 JS 脚本标签添加到 React
【发布时间】:2019-11-20 17:06:08
【问题描述】:

我在服务器上有一个 script.js 文件,它是用纯 javascript (vanilla) 编写的,并返回具有某些功能的 HTML 表单。 我通过第一个 <script> 标签下载它,并在 .html 文件中的第二个 <script> 标签中使用 script.js 中的函数,它正在工作。但我不知道如何让它在 React 中运行。我尝试这样做,但没有工作。

script.js

var lib = lib || (function() {
  var _args = {};

  return {
    init: function(Args) {
      _args = Args;
    },
    func: function() {
      ...some logic and use document.write
      for render
    }
  }
}())

在 HTML 中,它可以工作

<script src='http://someurl.com/checkout'></script>
<script>
  lib.init(...some args);
  lib.func();
</script>

在 React 中,它不起作用

import React, {
  Component
} from 'react';
import axios from "axios";

class Checkout extends Component {

  state = {}

  componentDidMount = async() => {
    axios.get("http://someurl.com/checkout")
      .then(res => {
        const scriptInit = document.createElement("script");
        scriptInit.src = "http://someurl.com/checkout";
        // or scriptInit.text = res.data;
        scriptInit.type = "text/javascript";
        scriptInit.async = true;
        const scriptFunc = document.createElement("script");
        scriptFunc.text = "lib.init(...); lib.func();";
        scriptFunc.async = true;
        const script = scriptInit.outerHTML + scriptFunc.outerHTML;
        this.setState({
          script
        });
      })

  }

  render() {
    const __html = this.state.script || "";
    return <div id = "checkout"
    dangerouslySetInnerHTML = {
      {
        __html
      }
    }
    />
  }
}

export default Checkout;

使用所有脚本标签渲染 div 标签,但分辨率为 1110 x 0

【问题讨论】:

  • but with 1110 x 0 resolution 是什么意思,解决方案与脚本问题有何关系?
  • 我试过script*.innerHTML,但它从script.js返回js代码
  • @MoshFeu 这是在我打开 chrome devtolls' (F12) Elements 选项卡时写的
  • 有道理。但我仍然试图了解问题所在。是不是脚本没有运行?
  • 写你的意思是这是脚本的维度还是包含div标签?如果是这样,则无关紧要,因为脚本不需要具有维度。

标签: javascript html reactjs


【解决方案1】:

您需要在脚本加载后调用这些函数。您不需要 axios,您可以使用脚本加载的 onload 回调来实现这一点。

componentDidMount(){
 const script = document.createElement("script");
 document.head.appendChild(script);
 script.src = "http://someurl.com/checkout";
 script.async = true;
 script.onload = () => this.runScriptMethods();
}

runScriptMethods(){
  lib.init(...);
  lib.func()
}

【讨论】:

  • 但是如果我的脚本使用 document.write 渲染一些元素并且必须在 body 和 lib 函数中实现在 script.js 中?
  • 感谢它的工作,但只有在 runScriptMethods() 中的 eval("lib.init()...") 的帮助下 - 它不是那么好
  • 不,这不好,我不确定您为什么需要评估。如果您尝试在没有(例如lib.init())的情况下运行它,会发生什么?
  • @MoshFeu 'lib' 未定义。因为 lib 对象是在另一个 url/server 上的 script.js 中定义的
  • 只要脚本在网站上下文中执行就没有关系。而且,它与使用 eval 运行它并没有什么不同。
猜你喜欢
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 2020-12-21
  • 2020-06-09
  • 1970-01-01
相关资源
最近更新 更多