我有一个相对简单的问题是尝试将内联脚本添加到 React 组件。到目前为止我所拥有的:
'use strict'; import '../../styles/pages/people.scss'; import React, { Component } from 'react'; import DocumentTitle from 'react-document-title'; import { prefix } from '../../core/util'; export default class extends Component { render() { return ( <DocumentTitle title="People"> <article className={[prefix('people'), prefix('people', 'index')].join(' ')}> <h1 className="tk-brandon-grotesque">People</h1> <script src="https://use.typekit.net/foobar.js"></script> <script dangerouslySetInnerHTML={{__html: 'try{Typekit.load({ async: true });}catch(e){}'}}></script> </article> </DocumentTitle> ); } };
我也试过:
<script src="https://use.typekit.net/foobar.js"></script> <script>try{Typekit.load({ async: true });}catch(e){}</script>
这两种方法似乎都无法执行所需的脚本。我猜这是我错过的一件简单的事情。有人可以帮忙吗?
PS:忽略 foobar,我有一个实际使用的真实 ID,我不想分享。
您是想在每次渲染该组件时一次又一次地获取并执行脚本,还是仅在该组件安装到 DOM 时一次?
也许尝试这样的事情:
componentDidMount () { const script = document.createElement("script"); script.src = "https://use.typekit.net/foobar.js"; script.async = true; document.body.appendChild(script); }
但是,这仅在您要加载的脚本不能作为模块/包提供时才真正有用。首先,我总是:
npm install typekit
import
import Typekit from 'typekit';
这可能是您安装软件包的方式react和react-document-title您的示例,并且npm 上有一个 Typekit 软件包可用。
react
react-document-title
现在我们有了钩子,更好的方法可能是useEffect像这样使用:
useEffect
useEffect(() => { const script = document.createElement('script'); script.src = "https://use.typekit.net/foobar.js"; script.async = true; document.body.appendChild(script); return () => { document.body.removeChild(script); } }, []);
这使它成为自定义钩子的绝佳候选者(例如:)hooks/useScript.js:
hooks/useScript.js
import { useEffect } from 'react'; const useScript = url => { useEffect(() => { const script = document.createElement('script'); script.src = url; script.async = true; document.body.appendChild(script); return () => { document.body.removeChild(script); } }, [url]); }; export default useScript;
可以这样使用:
import useScript from 'hooks/useScript'; const MyComponent = props => { useScript('https://use.typekit.net/foobar.js'); // rest of your component }