React useState 值未在 ref 回调中更新
React useState value not updated in ref callback
我有一个名为 SignUp
的功能组件,它使用 google recaptcha 来保护注册表单。
Signup
创建一个指向 Recaptcha
组件的 ref 并声明一个指向函数方法 onRecaptchaResolved
的回调函数 onResolved
问题是当onRecaptchaResolved
在Recaptcha执行后调用时,我们输入的值不是最新状态,而是useState
设置的初始值
在我们的例子中 "hi"
import React, { useState } from 'react';
import styled from 'styled-components';
import Recaptcha from 'react-google-invisible-recaptcha';
const Input = styled.input``
function SignUp({dispatch}) {
const [inputValue, setInputValue] = useState("hi");
let recaptcha = null; // this will be our ref
const formSubmit = () => {
recaptcha.execute()
}
const onRecaptchaResolved = ( recaptchaToken) => {
console.log(inputValue); // always logs; "hi"
}
return (
<>
<Input
placeholder="you@example.com"
type="text"
value={inputValue}
onChange={e => setInputValue(e.target.value)
}
/>
<Recaptcha
ref={ ref => recaptcha = ref }
sitekey={ "{MY_SITE_KEY}" }
onResolved={recaptchaToken =>{ onRecaptchaResolved(recaptchaToken)} }
/>
<SubmitButton onClick={formSubmit}> Submit email</SubmitButton>
</>
)
}
如何确保onRecaptchaResolved
中读取的输入值是更新后的值?
react-google-invisible-recaptcha
似乎存储了 onResolved
中提供的初始值并且不会更新它,除非重新安装 <Recaptcha>
。看
https://github.com/szchenghuang/react-google-invisible-recaptcha/blob/master/src/index.js#L41
确认这一点的最简单方法是在 <Recaptcha>
上设置一个 key
,它会随着 inputValue
的变化而变化。
我有一个名为 SignUp
的功能组件,它使用 google recaptcha 来保护注册表单。
Signup
创建一个指向 Recaptcha
组件的 ref 并声明一个指向函数方法 onRecaptchaResolved
onResolved
问题是当onRecaptchaResolved
在Recaptcha执行后调用时,我们输入的值不是最新状态,而是useState
设置的初始值
在我们的例子中 "hi"
import React, { useState } from 'react';
import styled from 'styled-components';
import Recaptcha from 'react-google-invisible-recaptcha';
const Input = styled.input``
function SignUp({dispatch}) {
const [inputValue, setInputValue] = useState("hi");
let recaptcha = null; // this will be our ref
const formSubmit = () => {
recaptcha.execute()
}
const onRecaptchaResolved = ( recaptchaToken) => {
console.log(inputValue); // always logs; "hi"
}
return (
<>
<Input
placeholder="you@example.com"
type="text"
value={inputValue}
onChange={e => setInputValue(e.target.value)
}
/>
<Recaptcha
ref={ ref => recaptcha = ref }
sitekey={ "{MY_SITE_KEY}" }
onResolved={recaptchaToken =>{ onRecaptchaResolved(recaptchaToken)} }
/>
<SubmitButton onClick={formSubmit}> Submit email</SubmitButton>
</>
)
}
如何确保onRecaptchaResolved
中读取的输入值是更新后的值?
react-google-invisible-recaptcha
似乎存储了 onResolved
中提供的初始值并且不会更新它,除非重新安装 <Recaptcha>
。看
https://github.com/szchenghuang/react-google-invisible-recaptcha/blob/master/src/index.js#L41
确认这一点的最简单方法是在 <Recaptcha>
上设置一个 key
,它会随着 inputValue
的变化而变化。