Javascript 未立即更新Reactjs设置状态
我有一个功能,我试图获取一系列电子邮件,并检查它是否为有效电子邮件:Javascript 未立即更新Reactjs设置状态,javascript,reactjs,asynchronous,setstate,Javascript,Reactjs,Asynchronous,Setstate,我有一个功能,我试图获取一系列电子邮件,并检查它是否为有效电子邮件: handleValidEmail = (isValid, index, emailValue) => { // checks if empty state in optional fields. const { emailValueList, isValidEmailArray, isValidEmail } = this.state; // need to make copy, to treat the
handleValidEmail = (isValid, index, emailValue) => {
// checks if empty state in optional fields.
const { emailValueList, isValidEmailArray, isValidEmail } = this.state;
// need to make copy, to treat the array as immutable
const newEmailValueList = [...emailValueList];
newEmailValueList[index] = emailValue;
const newIsValidEmailArray = [...isValidEmailArray];
newIsValidEmailArray[index] = isValid;
this.setState({
emailValueList: newEmailValueList,
isValidEmailArray: newIsValidEmailArray,
}, () => {
console.log(emailValueList, isValidEmailArray);
console.log('before', isValidEmail);
if (every(isValidEmailArray, Boolean)) {
this.setState({ isValidEmail: isValid });
} else {
this.setState({ isValidEmail: false });
}
console.log('isvalidEmail', isValidEmail);
});
}
所以我做了一些挖掘,我知道如果你回调你的setState,它应该会工作。然而,我没有让我的工作
因此,当我在输入字段中键入时:test@gmail.co,控制台将记录:
console.log(emailValueList,isValidEmailArray)代码>=[”test@gmail.c“],[false]
console.log('before',isValidEmail)错误前的代码>=
console.log('isvalidEmail',isvalidEmail)代码>=isvalidEmail false
当我输入最后一个字母“m”时test@gmail.com
console.log(emailValueList,isValidEmailArray)代码>=[”test@gmail.co“],[true]
console.log('before',isValidEmail)错误前的代码>=
console.log('isvalidEmail',isvalidEmail)代码>=isvalidEmail false
然后,当我在末尾添加另一个字母时:
console.log(emailValueList,isValidEmailArray)代码>=[”test@gmail.com“],[true]
console.log('before',isValidEmail)代码>=在true之前
console.log('isvalidEmail',isvalidEmail)代码>=isvalidEmail true
我试图让isValidEmail在testing@gmail.co
为什么我没有得到这个结果?如果(every(isValidEmailArray,Boolean)){
对此:if(every(newIsValidEmailArray,Boolean)){
您仍在引用旧状态
除非您将该行放入另一个从setState
:console.log('isvalidEmail',isvalidEmail);
对setState的调用不是“即时的”:
您也可以包含html文件吗?您正在记录的isValidEmail
不是当前的状态值,它是您先前在handleValidEmail
函数(const{…,isValidEmail}=…
)中设置的值。当您更改状态时,该变量的值不会更改