Reactjs React/Firebase设置状态无更新

Reactjs React/Firebase设置状态无更新,reactjs,Reactjs,我遇到了一个用户在表单上提交电子邮件地址的问题。电子邮件地址在firebase数据库中查找…然后绑定到将被推送到阵列中的其他数据不幸的是,我目前必须单击提交按钮两次才能正确呈现证书。我一直在查看有关回调等的不同信息。我简化了用户单击提交后运行的代码。如果这是一个重复的问题,请道歉…我发现的信息都没有引导我正确的方向。回到原点 processEmail(e) { var certs = []; e.preventDefault(); Fire.database().ref().orderBy

我遇到了一个用户在表单上提交电子邮件地址的问题。电子邮件地址在firebase数据库中查找…然后绑定到将被推送到阵列中的其他数据不幸的是,我目前必须单击提交按钮两次才能正确呈现证书。我一直在查看有关回调等的不同信息。我简化了用户单击提交后运行的代码。如果这是一个重复的问题,请道歉…我发现的信息都没有引导我正确的方向。回到原点

processEmail(e) {
var certs = [];


e.preventDefault();

Fire.database().ref().orderByChild('Email').equalTo(this.inputEl.value).on('value', function(snapshot) {
  if (snapshot.exists()) {
    snapshot.forEach(function(childSnapshot) {

      var key = childSnapshot.key;


      certs.push(snapshot.child(key+"/Item").val());


  })

  } else {
    console.log('nope');
    alert("Looks like we can't find you.");
  }

})


this.setState({
  cert: certs
});
}

所以我想出来了。谢谢加布里埃尔为我指明了正确的方向。下面是一些更新的代码,供将来可能会发现这一点的人使用。需要注意的是…无法在Firebase调用中使用“this”,因此必须让updateState=this。此外,当推送到一个数组时,将数组保持在循环之外,否则每次迭代只会使用一个值重置它自己。很简单

processEmail(e) {

e.preventDefault();

let updateState = this;

Fire.database().ref().orderByChild('Email').equalTo(this.inputEl.value).on('value', function(snapshot) {
  if (snapshot.exists()) {
    var certs = [];
    snapshot.forEach(function(childSnapshot) {


      var key = childSnapshot.key;

      certs.push(snapshot.child(key+"/Item").val());

      first.push(snapshot.child(key+"/First Name").val());

      lastN.push(snapshot.child(key+"/Last Name").val());

      updateState.setState({
        cert: certs
      });


  })

  } else {
    console.log('nope');
    alert("Sorry! Looks like we can't find you.");
  }

})

}

this.setState
可能应该从
if(snapshot.exists()){..}
块内部调用。