【发布时间】:2021-09-15 19:03:55
【问题描述】:
我正在尝试在 Next.js 中的联系表单上实施 Google Recaptcha。它会在需要时弹出挑战,但无论如何都会发送表单。 到目前为止,这是我的代码:
// Recaptcha
const recaptchaRef = useRef();
// Form validation
const [validated, setValidated] = useState(false);
// Reset form
const formRef = useRef();
const handleReset = () => {
formRef.current.reset();
setValidated(false);
};
// Thank you Message
const [thankYouMessage, setThankYouMessage] = useState(false);
// Form submit handler
async function handleSubmit(e) {
e.preventDefault();
e.stopPropagation();
// Execute the reCAPTCHA when the form is submitted
recaptchaRef.current.execute();
const formData = new FormData();
Array.from(e.currentTarget.elements).forEach((field) => {
if (!field.name) return;
formData.append(field.name, field.value);
});
await fetch(process.env.NEXT_PUBLIC_WORDPRESS_CF7_ENDPOINT, {
body: formData,
method: "POST",
})
.then((response) => response.json())
.then((response) => {
if (response.status === "mail_sent") {
setThankYouMessage(!thankYouMessage);
} else if (response.status === "mail_failed") {
alert("Message failed to send.");
}
});
setValidated(true);
handleReset();
recaptchaRef.current.reset();
}
在表格上:
<Form
ref={formRef}
validated={validated}
onSubmit={handleSubmit}
>
<ReCAPTCHA
ref={recaptchaRef}
size="invisible"
sitekey={process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY}
/>
这当然行不通,因为即使 recaptcha 被触发,它仍然会发送表单。
我尝试在<ReCAPTCHA /> 上添加onChange={onReCAPTCHAChange},但随后出现错误Uncaught (in promise) ReferenceError:
const onReCAPTCHAChange = (captchaCode) => {
// If the reCAPTCHA code is null or undefined indicating that
// the reCAPTCHA was expired then return early
if (!captchaCode) {
return;
}
// Else reCAPTCHA was executed successfully so proceed with the
// alert
alert(`Hey, ${email}`);
// Reset the reCAPTCHA so that it can be executed again if user
// submits another email.
recaptchaRef.current.reset();
};
【问题讨论】:
-
尝试将 reCAPTCHA 检查后需要发生的任何事情转移到
onReCAPTCHAChange函数。 -
啊,我想我明白了。您的意思是将
handleSubmit操作放入onReCAPTCHAChange函数中,对吗? -
是的,我就是这个意思。
-
@juliomalves 我尝试将
async function handleSubmit(e)中的所有内容放在onReCAPTCHAChange中,但随后handleSubmit函数将不起作用。介意给我写个例子吗?
标签: reactjs next.js recaptcha react-google-recaptcha