小编典典

将脚本标签添加到 React/JSX

all

我有一个相对简单的问题是尝试将内联脚本添加到 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,我不想分享。


阅读 85

收藏
2022-03-21

共1个答案

小编典典

编辑:事情变化很快,这已经过时了 - 请参阅更新


您是想在每次渲染该组件时一次又一次地获取并执行脚本,还是仅在该组件安装到 DOM 时一次?

也许尝试这样的事情:

componentDidMount () {
    const script = document.createElement("script");

    script.src = "https://use.typekit.net/foobar.js";
    script.async = true;

    document.body.appendChild(script);
}

但是,这仅在您要加载的脚本不能作为模块/包提供时才真正有用。首先,我总是:

  • 在npm上查找包
  • 在我的项目中下载并安装包(npm install typekit
  • import我需要的包(import Typekit from 'typekit';

这可能是您安装软件包的方式reactreact-document-title您的示例,并且npm 上有一个 Typekit
软件包可用


更新:

现在我们有了钩子,更好的方法可能是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

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
}
2022-03-21