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}=…
)中设置的值。当您更改状态时,该变量的值不会更改