[英]How do you embed and call an external javascript function in a react component?
我正在尝试将此地图合并到现有的grails / react项目中。
更新的代码:
index.js
ReactDOM.render((
<Router history = {browserHistory}>
<Route path="/" component={CreateAccount}/>
<Route path="/menu" component={Menus}/>
<Route path="/discover" component={DiscoverApp}/>
<Route path="/NorthAmerica" component={northAmerica}/>
<Route path="/SouthAmerica" component={southAmerica}/>
<Route path="/Europe" component={europe}/>
<Route path="/Asia" component={asia}/>
<Route path="/Africa" component={africa}/>
<Route path="/Australia" component={australia}/>
</Router>
), document.getElementById('root'));
index.gsp中
<head>
<title>Food App</title>
<link rel="stylesheet" href="${resource(dir: 'css', file: 'text.css')}" type = "text/css">
<link rel="stylesheet" href="${resource(dir: 'css', file: 'jquery-jvectormap-2.0.3.css')}" type = "text/css" media="screen">
<javascript src="/js/jquery-3.1.1.js" />
<javascript src="jquery-jvectormap-2.0.3.min.js" />
<javascript src="jquery-jvectormap-world-mill-en.mins.js" />
</head>
<body>
<div id="root" align="left"></div>
<br/>
<asset:javascript src="bundle.js"/>
</body>
</html>
和
import React, { Component } from 'react';
import {Link} from 'react-router';
import $ from 'jquery';
import ReactDOM from 'react-dom';
class NorthAmerica extends Component {
componentDidMount() {
const el = ReactDOM.findDOMNode(this.display);
$(el).vectorMap({map: 'world_mill_en'});
}
render(){
return(
<div>
<h1>NORTH AMERICA MAP PLACE-HOLDER</h1>
<li><Link to="/discover">DISCOVER</Link></li>
<div
ref={display => this.display = display}
/>
</div>
)
}
}
export class northAmerica extends React.Component{
render(){
return(<NorthAmerica/>);
}
}
有什么建议? 谢谢!
更新:
页面加载现在...但地图应该是一个空白div。 我在控制台中收到此错误:
Uncaught TypeError: (0 , _jquery2.default)(...).vectorMap is not a function
at NorthAmerica.componentDidMount (bundle.js?compile=false:12781)
at bundle.js?compile=false:26803
at measureLifeCyclePerf (bundle.js?compile=false:26613)
at bundle.js?compile=false:26802
at CallbackQueue.notifyAll (bundle.js?compile=false:9088)
at ReactReconcileTransaction.close (bundle.js?compile=false:31708)
at ReactReconcileTransaction.closeAll (bundle.js?compile=false:5241)
at ReactReconcileTransaction.perform (bundle.js?compile=false:5188)
at ReactUpdatesFlushTransaction.perform (bundle.js?compile=false:5175)
at ReactUpdatesFlushTransaction.perform (bundle.js?compile=false:1438)
React中的refs
需要抓取React组件中的底层DOM。 一旦在组件中可用,就可以在jQuery元素上调用第三方库函数,如vectorMap
。 下面是React组件的示例,假设所有适当的依赖库都可用于呈现DOM。
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import $ from 'jquery';
class NorthAmerica extends Component {
componentDidMount() {
const el = ReactDOM.findDOMNode(this.display);
$(el).vectorMap({map: 'world_mill_en'});
}
render() {
return <div>
<h1>World Map</h1>
<div
ref={display => this.display = display}
style={{width: '600px', height: '400px'}}
/>
</div>;
}
}
/*
* Render the above component into the div#app
*/
ReactDOM.render(<NorthAmerica />, document.getElementById('app'));
下面是示例codepen不起作用,因为我无法提供适当版本的jqueryvectormap
库。
您应该使用React的一个组件生命周期方法来执行您的函数,而不是尝试呈现内联脚本标记。 尝试从render方法中删除内联脚本并添加componentDidMount方法:
componentDidMount() {
$(your jQuery function here);
}
假设您正在使用webpack,您可能希望将jquery声明为外部,但上面应该至少可以启动并运行。
代替:
let NorthAmerica = React.createClass({
您可以直接导出:
export default class NorthAmerica extends React.Component {
然后删除最后一个代码块:
export class northAmerica extends React.Component{
render(){
return(<NorthAmerica/>);
}
}
您无法看到任何内容的原因是因为您的NorthAmerica组件尚未添加到DOM中。 尝试:
ReactDOM.render(
<NorthAmerica />,
document.getElementById('root')
);
其中'root'替换为index.gsp中div的名称,它是所有反应内容的容器,请参阅此处输入链接描述
为此,您需要额外导入:
import ReactDOM from 'react-dom';
仅在从其他文件使用NorthAmerica时才需要导出。 如果您还没有这样做,那么就不需要了,请看这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.