我在反应JSX中加载外部脚本时遇到问题
<script>
(function(d) {
var config = {
kitId: 1234567,
scriptTimeout: 3000,
async: true
},
h=d.documentElement,t=setTimeout(function(){h.className=h.className.replace(/\bwf-loading\b/g,"")+" wf-inactive";},config.scriptTimeout),tk=d.createElement("script"),f=false,s=d.getElementsByTagName("script")[0],a;h.className+=" wf-loading";tk.src='https://use.typekit.net/'+config.kitId+'.js';tk.async=true;tk.onload=tk.onreadystatechange=function(){a=this.readyState;if(f||a&&a!="complete"&&a!="loaded")return;f=true;clearTimeout(t);try{Typekit.load(config)}catch(e){}};s.parentNode.insertBefore(tk,s)
})(document);
</script>
这里是我的渲染函数,我希望javascipt加载asyn,它在html文件中非常简单,但是我在一个反应组件中被震惊了如何做到了实现。 (如果我可以避免安装另一个外部模块将是最好的)。非常感谢
render() {
return (
<head>
//Script to load asyn
</head>
)
}
答案 0 :(得分:3)
我的服务器渲染了最初的HTML文档,因此我无法像@mjhm建议的那样将其插入到头部。使用@bluebill1049的答案,我能够使用ES6模板字符串并做出反应dangerouslySetInnerHTML
import React, {Component} from 'react';
export default class Html extends Component {
render() {
const loadTypeKit = `
(function(d) {
var config = {
kitId: 'YOUR_KITID',
scriptTimeout: 3000,
async: true
},
h=d.documentElement,
t=setTimeout(function() {
h.className=h.className.replace(/wf-loading/g,"")+" wf-inactive";
},config.scriptTimeout),
tk=d.createElement("script"),
f=false,
s=d.getElementsByTagName("script")[0],
a;
h.className+=" wf-loading";
tk.src='https://use.typekit.net/'+config.kitId+'.js';
tk.async=true;
tk.onload=tk.onreadystatechange=function() {
a=this.readyState;
if(f||a&&a!="complete"&&a!="loaded") return;
f=true;
clearTimeout(t);
try{
Typekit.load(config)
} catch(e){ }
};
s.parentNode.insertBefore(tk,s);
})(document);
`;
return (
<html>
<head>
<script dangerouslySetInnerHTML={{__html: loadTypeKit}} />
</head>
<body>
...
</body>
</html>
);
}
}
答案 1 :(得分:1)
dangerouslySetInnerHTML 是我找到的解决方案。
https://facebook.github.io/react/tips/dangerously-set-inner-html.html
这允许您拥有脚本标记并在jSX的一侧插入JavaScript。