当前位置: 首页 > 知识库问答 >
问题:

向React/JSX添加脚本标记

宗政招
2023-03-14

我有一个比较简单的问题,就是尝试将内联脚本添加到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实际上在使用,我不想分享。

共有2个答案

陶温书
2023-03-14

除了上面的答案之外,您还可以执行以下操作:

import React from 'react';

export default class Test extends React.Component {
  constructor(props) {
    super(props);
  }

  componentDidMount() {
    const s = document.createElement('script');
    s.type = 'text/javascript';
    s.async = true;
    s.innerHTML = "document.write('This is output by document.write()!')";
    this.instance.appendChild(s);
  }

  render() {
    return <div ref={el => (this.instance = el)} />;
  }
}

div被绑定到this,脚本被注入其中。

可以在CodeSandBox.io上找到演示

方斌
2023-03-14

您想要一次又一次地获取并执行脚本吗,每次呈现此组件时,还是只在将此组件挂载到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)
  • 导入需要它的包(从“Typekit”导入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
}
 类似资料:
  • 问题内容: 我有一个相对简单的问题,试图将内联脚本添加到React组件。到目前为止,我有: 我也尝试过: 两种方法似乎都无法执行所需的脚本。我猜这是我所缺少的简单事情。有人可以帮忙吗? PS:忽略foobar,我有一个真正的ID正在使用中,而我不想共享。 问题答案: 编辑:事情变化很快,这已经过时了-查看更新 您是否想在每次渲染此组件时一次或一次将该组件安装到DOM中时一次又一次地获取并执行脚本?

  • 问题内容: 我有一个相对简单的问题,试图将内联脚本添加到React组件中。到目前为止,我有: 我也尝试过: 两种方法似乎都无法执行所需的脚本。我想这很简单,我很想念。有人可以帮忙吗? PS:忽略foobar,我确实有一个真正的ID正在使用,而我不想共享。 问题答案: 编辑:事情变化很快,这已经过时了-查看更新 您是否想在每次渲染此组件时一次或一次将该组件安装到DOM中时一次又一次地获取并执行脚本?

  • 嗨,我试图创建一个由JComboBox和JTextField组成的接口。我已经整理好了向JComboBox添加标签的代码,但是我在向文本字段添加标签时遇到了麻烦。如有任何帮助,不胜感激。

  • 我目前在按钮按钮上用于“显示当天报价”的脚本缺少一个功能:链接支持= 仅仅添加一个普通的“href”不起作用,它只显示为文本。 还有别的办法吗?

  • 问题内容: 我已经编辑了package.json以自定义“开始”脚本,因此它将–debug标志添加到节点: 有没有一种方法可以添加新脚本,例如调试脚本,该脚本可以执行我自定义的“开始”现在正在执行的操作? 我希望能够执行: 问题答案: 在您的package.json中定义脚本 然后您可以使用npm的运行脚本 或更短的版本

  • 我正在开发一个页面,该页面使用JavaScipt通过ajaxpost将数据发送到PHP脚本。问题是,如果输入的语言不是基于拉丁语的,我最终会在MySQL表中存储胡言乱语。拉丁字母很好用。 页面本身能够呈现UTF-8字符,如果这些字符在页面加载时提供的数据中,那么我要处理的就是这篇文章。 اختبار 和保存。请参阅浏览器的开发工具中的网络POST请求。 这篇文章是通过下面的JS函数完成的 这是我的