【问题标题】:Adding Marketo Form to Gatsby/JSX将 Marketo 表单添加到 Gatsby/JSX
【发布时间】:2019-11-18 10:41:48
【问题描述】:

我正在尝试将 Marketo 表单添加到 Gatsby 网站,但在将脚本注入页面的顺序上遇到问题。

当我尝试渲染下面的组件时,我收到错误消息“ReferenceError: MktoForms2 is not defined”。

我尝试注释掉整个 useEffect 代码块,并且组件在没有表单的情况下可以正常呈现到页面。然后当我将 "MktoForms2.loadForm("//app-sj11.marketo.com", "XXX-XXX-XXX", 1608)" 粘贴到控制台时,表单会按预期显示。

import React, { useEffect } from "react";
import Helmet from "react-helmet";

import "./form.scss";

const FormContactMkto = () => {
  useEffect(() => {
    MktoForms2.loadForm("//app-sj11.marketo.com", "XXX-XXX-XXX", 1608);
  }, []);

  return (
    <div>
      <Helmet>
        <script
          src="//app-sj11.marketo.com/js/forms2/js/forms2.min.js"
          type="text/javascript"
        />
      </Helmet>
      <form id="mktoForm_1608"></form>
    </div>
  );
};

export default FormContactMkto;

如何将此 Marketo 表单加载到 Gatsby 页面中?非常感谢任何帮助或建议!

【问题讨论】:

    标签: reactjs forms jsx gatsby marketo


    【解决方案1】:

    我为我的项目创建了一个简单的组件。也许它对你的情况有用。

    import React, { useState, useEffect } from 'react';
    
    const marketoScriptId = 'mktoForms';
    
    export default function MarketoForm({ formId }) {
      const [isLoaded, setIsLoaded] = useState(false);
    
      useEffect(() => {
        if (!document.getElementById(marketoScriptId)) {
          loadScript();
        } else {
          setIsLoaded(true);
        }
      }, []);
    
      useEffect(() => {
        isLoaded &&
          window.MktoForms2.loadForm(
            '//app-XX.marketo.com',
            'XXX-XXX-XXX',
            formId
          );
      }, [isLoaded, formId]);
    
      const loadScript = () => {
        var s = document.createElement('script');
        s.id = marketoScriptId;
        s.type = 'text/javascript';
        s.async = true;
        s.src = '//app-XX.marketo.com/js/forms2/js/forms2.min.js';
        s.onreadystatechange = function() {
          if (this.readyState === 'complete' || this.readyState === 'loaded') {
            setIsLoaded(true);
          }
        };
        s.onload = () => setIsLoaded(true);
        document.getElementsByTagName('head')[0].appendChild(s);
      };
    
      return (
        <div>
          <form id={`mktoForm_${formId}`}></form>
        </div>
      );
    }
    
    

    【讨论】:

    • 哇,我对反应和盖茨比还比较陌生,整个周末我都在努力解决这个问题。谢谢!这对我很有帮助...
    猜你喜欢
    • 2020-09-20
    • 2020-12-01
    • 2021-07-23
    • 2019-09-02
    • 2019-07-05
    • 1970-01-01
    • 2021-01-20
    • 2020-08-15
    相关资源
    最近更新 更多