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