2016-11-24 40 views
2

我想在新的ReactJS应用程序中使用ES5模块,并且我很努力地理解如何正确地导入该模块,使得它内部的主要功能可以被发现并执行。导入一个旧的ES5模块在ReactJS组件中使用

我正在加载模块; import 'air-datepicker';

我知道我在这里做错了事,对于没有适当出口的旧图书馆来说,它并不是那么简单!

无论如何,那么我应该能够使用像这样的现有的div手动初始化日期选择器;

$('#myDiv').datepicker(); 

我已经试过进口的多种变化和需要,但我总是得到同样的错误 - “日期选择器是不是一个函数”。

我正在试验的图书馆是air-datepicker。我已经使用npm安装了模块,没有问题,我知道这个库在没有React的情况下可以很好地工作,只需在脚本标记中手动加载脚本。我的ReactJS应用程序是使用FB教程页面中的“create-react-app”创建的基本模板。

+0

你使用'npm install --save air-datepicker'来安装它吗?或者在你的html中添加了一个'''? – jpdelatorre

+0

npm安装。通过脚本标签原本在一个简单的演示页面,只是为了证明它的作品! –

+0

你使用的是webpack吗?另外,看起来像air-datepicker使用jquery,你也有jquery加载吗? – jpdelatorre

回答

2

那么,这是我一生中的一天,我永远不会回来!

问题是由Babel导入顺序造成的。导入语句被提起 - 意味着它们在执行任何其他代码(即我的窗口赋值)之前首先被评估。这是babel中的'by design'。

从我所知道的情况来看,避免巴别塔吊装的唯一方法是完全避免“导入”,而是使用require。

所以,按照以下顺序,当您需要空气约会器时,全局$将被设置。如果您尝试'导入'空气日期选择器,它将不起作用,因为Babel将在执行窗口之前评估您的所有导入语句。分配。

import $ from 'jquery'; 
window.$ = $; 
require('air-datepicker'); 

有一个或者这也将工作过的其他两种方法,但他们都不太理想,因为他们需要你手动配置的WebPack - 即“喷出”的创建反应的,应用程序配置和单干...

使用imports-loader;

// only works if you disable no-webpack-loader-syntax 
require("imports?$=jquery!air-datepicker"); 

或者,使用ProvidePlugin,使模块可用于所有模块。

0

你必须给它一个标识符:如果您使用create-react-app

import datepicker from 'air-datepicker'; 
+0

我试过这个和类似的变化,不起作用。 –

2

,你应该能够将其导入像

import 'air-datepicker/dist/css/datepicker.min.css'; 
import 'air-datepicker'; 

如果添加使用<script>标记您的jQuery您的HTML,您需要在空气拣货日前添加此行

const $ = window.jQuery; 
const jQuery = window.jQuery; 

如果您使用npm install加入jQuery的,你必须添加这些以下行

import $ from 'jquery'; 
import jQuery from 'jquery'; 
window.$ = $; 
window.jQuery = jQuery; 
//... air-datepicker imports 

确保初始化您componentDidMount或地方你确定元素已经安装已经内。

componentDidMount() { 
    $('#my-element').datepicker(); 
} 

render() { 
    return <div> 
     <input 
      id="my-element" 
      type='text' 
      className="datepicker-here" 
      data-position="right top" /> 
    </div> 
} 
+0

当通过HTML中的

  • 11. 在intellij中使用导入的模块
  • 12. 导入一个公共模块的包中的几个模块
  • 13. ReactJS - 导入组件不显示在DOM
  • 14. 导入一个模块
  • 15. JavaScript'将一个模块导入到另一个模块中
  • 16. 如何使用模块模式在es5中实现'ES6 imports'
  • 17. 导入一个模块并在julialang中使用
  • 18. 在Reactjs中使用另一个组件中的数据
  • 19. 如何导入已导入另一个文件的Python模块?
  • 20. 在Python中导入和使用模块
  • 21. 在android studio中使用模块导入
  • 22. 如何导入一个模块一个模块(ocaml的)
  • 23. 如何在JavaScript中使用define导入模块的子模块?
  • 24. 在导入的函数中使用导入的模块
  • 25. 如何在Angular 2中创建一个导入QuillJS模块的组件?
  • 26. 软件包导入创建了一个模块,子模块仍然可导入
  • 27. 如何导入一个模块在杨
  • 28. 模块中的角度导出组件不能在另一个模块中使用
  • 29. 导入导入主模块的模块
  • 30. 在Reactjs中使用不同组件的同一个reducer