gpt4 book ai didi

reactjs - Next.js 如何在我的联系表单中实现 react-google-recaptcha

转载 作者:行者123 更新时间:2023-12-04 13:52:09 34 4
gpt4 key购买 nike

我正在尝试在 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,它仍然会发送表单。
我试过添加 onChange={onReCAPTCHAChange}<ReCAPTCHA />但随后出现错误 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();
};

最佳答案

我认为在您的 handleSubmit 中您可以使用 executeAsync像这样的方法(如官方文档所示),这样你应该能够在handleSubmit中编写所有内容:

import ReCAPTCHA from "react-google-recaptcha";


const ReCAPTCHAForm = (props) => {
const recaptchaRef = React.useRef();

const handleSubmit = async () => {
try {
const token = await recaptchaRef.current.executeAsync();
// Add your API call code here also pass token to API
} catch(error) {
// handle validation error
}


}

return (
<form onSubmit={handleSubmit}>
<ReCAPTCHA
ref={recaptchaRef}
size="invisible"
sitekey="Your client site key"
/>
</form>
)

}

ReactDOM.render(
<ReCAPTCHAForm />,
document.body
);

关于reactjs - Next.js 如何在我的联系表单中实现 react-google-recaptcha,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68248672/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com