问题描述
我正在尝试将 recaptcha v2 添加到我的 Gatsby/Netlify 站点表单中,但我错过了实际显示小部件的最后一部分。它只是没有显示它的放置位置。
到目前为止我的代码是这样的
gatsby-ssr.js 文件:
import React from "react"
export const onRenderBody = ({ setHeadComponents,setPostBodyComponents }) => {
setHeadComponents([
<script
dangerouslySetInnerHTML={{
__html: `
function onloadCallback() {
grecaptcha.render(document.getElementById('g-recaptcha'),{
"sitekey": '6LfMWLkaAAAAAFYM11ctU1Dxfz_v3SVrAKLOR3rM',})
}
`,}}
/>,])
setPostBodyComponents([
<script
key="abc"
type="text/javascript"
src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit"
async
defer1
/>,])
}
以及联系表格:
<Form className="contact-form" method="post" data-netlify-recaptcha="true" data-netlify="true" netlify-honeypot="bot-field">
...
<p className="hidden">
<label>Don’t fill this out if you’re human: <input name="bot-field" /></label>
</p>
...
<Form.Group id="recaptcha-container">
<div id="g-recaptcha" className="g-recaptcha" data-netlify-recaptcha="true" render="explicit"></div>
</Form.Group>
...
</Form>
在我向表单添加任何 Netlify 属性之前出现错误“Uncaught (in promise) Error: reCAPTCHA placeholder element must be an element or id”,所以我很确定这与它无关。
>有什么想法吗?谢谢。
解决方法
我认为您的问题是您将脚本直接嵌入到 React 的范围之外,因此它在加载时永远不会再水化。最简单的方法是添加 react-google-recaptcha
组件:
<Form className="contact-form" method="post" data-netlify-recaptcha="true" action="/" data-netlify="true" netlify-honeypot="bot-field">
...
<p className="hidden">
<label>Don’t fill this out if you’re human: <input name="bot-field" /></label>
</p>
...
<Form.Group id="recaptcha-container">
<ReCAPTCHA
sitekey="Your client site key"
onChange={onChange}
/>,</Form.Group>
...
</Form>
正如我所说,我认为您不需要 gatsby-ssr.js
实现,您可以通过添加 React 组件来实现更原生的实现,如上面的代码片段所示。您需要获取该值并将其发送到 Netlify 请求。我建议您也在表单组件中设置一个 action
。
您还缺少表单的一个关键属性:name
。否则,Netlify 将永远不会知道您的表单是如何命名的,也不会在仪表板中显示它(您也需要发送它)。
请记住,除非您将后台配置为接受本地请求 (127.0.0.1
),否则永远不会在本地加载 reCAPTCHA。
有用的资源: