我对反应/钩子非常陌生,并且努力让 Google recaptcha 正常工作。
这就是我的app.js的样子:
import ConfirmationPage from './Pages/ConfirmationPage';
function App() {
const [email, setEmail] = React.useState('');
const captchaRef = useRef({});
function someFunction() {
//Uses captchaRef to do something
}
return (
<ConfirmationPage email={email} setEmail={setEmail} captchaRef={captchaRef}></ConfirmationPage>
);
}
这就是我的ConfirmationPage.js的样子:
import ReCAPTCHA from "react-google-recaptcha";
import { Grid, TextField, Divider } from '@material-ui/core';
export default function ConfirmationPage({email, setEmail, captchaRef}) {
function onChange(value) {
console.log("Captcha Verified");
}
function handleEmailBlur(email){
setEmail(email);
}
return (
<>
<TextField
required
id="txt_summary_email"
label={'Email'}
defaultValue={email}
className={classes.FulltextField}
margin="normal"
onBlur={event=>handleEmailBlur(event.target.value)}
/>
<ReCAPTCHA
ref ={captchaRef}
sitekey={process.env.REACT_APP_CAPTCHAKEY}
onChange={onChange}
/>
</>
);
当用户尝试在 txt_summary_email 文本字段中输入电子邮件值时会出现问题,验证码会重新呈现自身并失去其验证状态。换句话说,通过单击空框并尝试在文本字段中输入电子邮件来验证 Captcha,Captcha 将失去验证检查。
这是由于 handleEmailBlur 函数中的 setEmail(email) 造成的。如果我注释掉 setEmail(email),Captcha 不会重新呈现自己。看起来 app.js 中的设置状态会以某种方式触发验证码重新加载。
触发 setState 时,如何防止重新渲染验证码?
非常感谢您的帮助!