【问题标题】:How to run external Javascript file plugin in ReactJS using lifecycle如何使用生命周期在 ReactJS 中运行外部 Javascript 文件插件
【发布时间】:2019-03-26 19:54:02
【问题描述】:

我正在使用外部 Javascript 文件设置动画插件来创建 Globe Tag Cloud。我已经在普通 html 上进行了测试,它运行良好,但是当我调用 ReactJS 时,它总是给我这样的错误消息:

类型错误: jquery__WEBPACK_IMPORTED_MODULE_6___default(...)(...).SVG3DTagCloud 是 不是函数

我正在使用生命周期方法,像这样,它成功地将 JS 文件注入 HTML 正文但仍然无法正常工作并给我错误消息。

componentDidMount() {
    var cloudTag = document.createElement('script');

    cloudTag.src = '/svg3dtagcloud.min.js';
    cloudTag.async = true;

    $(document).ready(function () {
      // This is was on the documentation https://github.com/NiklasKnaack/jquery-svg3dtagcloud-plugin
      var entries = [
        {label: 'Tag One', url: '#', target: '_top'},
        {label: 'Tag Two', url: '#', target: '_top'},
        {label: 'Tag Three', url: '#', target: '_top'},
        {label: 'Tag Four', url: '#', target: '_top'},
        {label: 'Tag Five', url: '#', target: '_top'}
      ];

      var settings = {
          entries: entries,
          width: 480,
          height: 480,
          radius: '65%',
          radiusMin: 75,
          bgDraw: true,
          bgColor: '#111',
          opacityOver: 1.00,
          opacityOut: 0.05,
          opacitySpeed: 6,
          fov: 800,
          speed: 1,
          fontFamily: 'Oswald, Arial, sans-serif',
          fontSize: '15',
          fontColor: '#fff',
          fontWeight: 'normal',
          fontStyle: 'normal',
          fontStretch: 'normal',
          fontToUpperCase: true,
          tooltipFontFamily: 'Oswald, Arial, sans-serif',
          tooltipFontSize: '11',
          tooltipFontColor: '#fff',
          tooltipFontWeight: 'normal',
          tooltipFontStyle: 'normal', 
          tooltipFontStretch: 'normal',
          tooltipFontToUpperCase: false,
          tooltipTextAnchor: 'left',
          tooltipDiffX: 0,
          tooltipDiffY: 10
      };

      cloudTag.onload = () => {
        $('#holder').SVG3DTagCloud(settings);
      }
    });

    document.body.appendChild(cloudTag);
}

如何运行外部 Javascript 插件文件以在 ReactJS 上正确运行?有什么方法可以在里面运行函数吗?

【问题讨论】:

  • 在 componentDidMount 中添加这个 if(!jQuery().SVG3DTagCloud) { $.fn.SVG3DTagCloud=function(){} }
  • @Sujit.Warrier 他做到了,从代码中可以看出
  • 很抱歉提交的评论不完整。已编辑
  • 这个想法很糟糕——你不能确定在脚本标签内固定源代码后库会停止加载,因为库的 init 函数可以是异步的。最好的方法是尽可能从 npm 导入它(你也可以加载 github 包)或在开始时加载所有 CDN 库并创建启动画面。由于您必须在库中等待,您还可以将 async 设置为 false;
  • @Sujit.Warrier 谢谢你,错误信息消失了,但仍然没有返回任何东西

标签: javascript jquery html reactjs


【解决方案1】:

如果可以的话,你不应该加载这样的库,除非你能以反应的方式来做。你在这段代码中所做的,你尝试在组件中创建异步副作用。对于组件内的异步操作,您应该尝试一些中间件。例如。 https://github.com/redux-observable/redux-observable 如果你使用 redux 来表示全局状态或 https://www.npmjs.com/package/redux-thunk。但是出于性能原因,我会在开始时简单地下载这个库,甚至用 web wroker 缓存它,只有在组件挂载时加载它并没有太大的收获。

【讨论】:

  • 我正在尝试假异步,但仍然没有返回任何内容。
  • @Dexter async false 可以通过知道加载库的顺序的方式设置 - 只是在 html 中以旧方式添加此库。您还可以尝试将库下载为内容类型文本并将 cloudTag.innerText 的内容设置为下载的代码 - 这样您就可以更准确地了解代码何时执行。但正如我所说,下载是 acync,所以要么使用 .then 或 await 语法,要么使用中间件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多