首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在通过react-helmet添加脚本标记时忽略TypeScript错误?

如何在通过react-helmet添加脚本标记时忽略TypeScript错误?
EN

Stack Overflow用户
提问于 2019-02-04 06:01:47
回答 3查看 1.2K关注 0票数 1

下面的tsx代码生成TypeScript错误。//@ts-ignore不工作。

代码语言:javascript
复制
<Helmet>
  <script>
    (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
    new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
    j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
    })(window,document,'script','dataLayer','GTM-*******');
  </script>
</Helmet>

下面的代码可以工作,但我想使用子<script>标记与script组件属性。

代码语言:javascript
复制
<Helmet
  script={[
    {
      type: 'application/javascript',
      innerHTML: '(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({\'gtm.start\':new Date().getTime(),event:\'gtm.js\'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!=\'dataLayer\'?\'&l=\'+l:\'\';j.async=true;j.src=\'https://www.googletagmanager.com/gtm.js?id=\'+i+dl;f.parentNode.insertBefore(j,f);})(window,document,\'script\',\'dataLayer\',\'GTM-*******\');'
    }
  ]}
/>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-09 03:29:17

多亏了https://github.com/nfl/react-helmet/issues/334#issuecomment-413319383才弄明白了。

代码语言:javascript
复制
<Helmet>
  <script>
    {`
      alert('BOOM');
    `} 
  </script>
</Helmet>
票数 1
EN

Stack Overflow用户

发布于 2019-02-04 16:52:18

这个脚本必须作为组件堆的一部分嵌入吗?

我在使用YouTube的iframe API时遇到了类似的问题,解决方案是创建script元素并引用创建的javascript对象(如果您需要这样做,看起来您实际上只是想导入一些JS)。我不需要为此创建react组件,除非有我想要管理的可视元素。

// GoogleTagManager.ts

代码语言:javascript
复制
export class GoogleTagManager {
  someVariable: someVariableType = null 

  constructor () {
    const script: HTMLScriptElement = <HTMLScriptElement>document.createElement('script')

    script.src = '[URL_TO_JS_FILE]'

    script.onload = (): void => console.log('loaded google tag manager')

    document.body.appendChild(script)
  }

  WaitForVariable (): void {
    let timeout: number

    const OnTimeout = (): void => {
      if (timeout) {
        clearTimeout(timeout)
      }

      if (typeof [TARGET_VARIABLE] !== 'undefined') {
        this.someVariable = [TARGET_VARIABLE]
        return
      }

      timeout = setTimeout(OnTimeout, 1000)
    }
  }
}

如果您想要显示一些信息,那么您可以将其转换为React组件,并将构造函数逻辑移动到componentDidMount。或者,我会考虑将任何结果数据发送到存储,并使用单独的组件来呈现结果数据。

票数 0
EN

Stack Overflow用户

发布于 2019-09-11 14:28:09

请谨慎使用dangerouslySetInnerHTML,如下所示:

代码语言:javascript
复制
<script
  dangerouslySetInnerHTML={{
    __html: `
    (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
    new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
    j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
    })(window,document,'script','dataLayer','GTM-*******');
`,
  }}
/>

但要小心cross-site scripting (XSS) attacks

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54508035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档