You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React JS应用中嵌入HubSpot表单并正确插入script标签?

React嵌入HubSpot表单解决方案

你用Helmet注入脚本失效的原因是,Helmet会把脚本插入到页面head,脚本加载完成时你页面上的表单容器还没渲染,或者hbspt初始化时找不到指定的渲染位置,导致表单没有正常生成。使用useEffect在组件挂载后动态加载脚本并初始化表单即可解决,修改后的完整代码如下:

import React, { useEffect } from 'react';
import SEO from "../common/SEO";
import Layout from "../common/Layout";
import ContactOne from "../elements/contact/ContactOne";

const ContactPage = () => {
    useEffect(() => {
        const formContainer = document.getElementById('hubspot-form');
        if (!formContainer) return;

        // 避免重复加载HubSpot脚本
        const existingScript = document.querySelector('script[src="//js-eu1.hsforms.net/forms/shell.js"]');
        const initHsForm = () => {
            window.hbspt.forms.create({
                region: "eu1",
                portalId: "25082527",
                formId: "8a7c2adb-5c41-4c47-8478-b1f1abe01e3f",
                target: '#hubspot-form'
            });
        };

        if (existingScript) {
            window.hbspt && initHsForm();
            return;
        }

        // 动态注入脚本
        const hsScript = document.createElement('script');
        hsScript.src = '//js-eu1.hsforms.net/forms/shell.js';
        hsScript.charset = 'utf-8';
        hsScript.onload = initHsForm;
        document.body.appendChild(hsScript);

        // 组件卸载清理
        return () => {
            formContainer.innerHTML = '';
        };
    }, []);

    return (
        <>
            <SEO title="Contact" desc="EXIGOH - Contact us now"/>
            <Layout>
                <div className="main-content">
                    {/* Start Contact Area  */}
                    <div className="rwt-contact-area rn-section-gap">
                        <div className="container">
                            <div className="row">
                                <div className="col-lg-12 mb--40">
                                    <div className="text-center">
                                        <h1 className="title theme-gradient h2" dangerouslySetInnerHTML={{__html: 'The Easiest Way To Start <br /> fill in & send.'}}/>
                                    </div>
                                </div>
                            </div>
                            
                            {/* 表单渲染容器 */}
                            <div id="hubspot-form"></div>

                            {/*<ContactOne/>*/}
                        </div>
                    </div>
                    {/* End Contact Area  */}
                </div>
            </Layout>
        </>
    )
}
export default ContactPage;

注意事项

  • 代码中新增了id="hubspot-form"的div作为表单的渲染容器,位置就是你原来标注要插入表单的地方
  • target参数必须配置,用来告诉HubSpot表单要渲染到哪个DOM节点下
  • 脚本加载逻辑做了去重处理,多次进入页面不会重复加载HubSpot的脚本
  • 组件卸载时会自动清空表单内容,避免残留DOM引发的问题

内容的提问来源于stack exchange,提问作者Kyrill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:57:02