Javascript React Native:使用;“设置状态”;有希望
我试图根据通过API检索的数据更新React组件的状态。但是,我无法在承诺中使用setState函数,因为React Native始终返回以下错误“Type error:_this2.setState不是函数”。以下是我如何努力实现以下目标:Javascript React Native:使用;“设置状态”;有希望,javascript,react-native,react-native-ios,Javascript,React Native,React Native Ios,我试图根据通过API检索的数据更新React组件的状态。但是,我无法在承诺中使用setState函数,因为React Native始终返回以下错误“Type error:_this2.setState不是函数”。以下是我如何努力实现以下目标: let foodList = []; Firebase.auth().onAuthStateChanged(function(user) { if (user) { Firebase
let foodList = [];
Firebase.auth().onAuthStateChanged(function(user) {
if (user) {
Firebase
.firestore()
.collection(`/userProfiles/${user.uid}/foodList`)
.get()
.then(foodListSnapshot => {
foodListSnapshot.forEach(snap => {
foodList.push({
foodName: snap.data().name,
mealConsumed: snap.data().meal,
estimatedCalories: snap.data().calories,
dateConsumed: snap.data().date
});
});
}).then((foodList) => {
this.setState({data: foodList});
}).catch(error => console.log(error));
} else {
Alert.alert('User not signed in');
}
});
我的目标是在状态的数据字段更新后,让组件重新渲染
我也尝试过使用
bind。这个但是,由于我对本地反应非常陌生,所以到目前为止我还没有找到答案。如果有人能帮我解决这个问题,我将非常感激!:) 您需要将函数(用户)
更改为(用户)=>{}
,因为function()不绑定外部作用域(状态)。所以它看起来像这样:
let foodList=[];
Firebase.auth().onAuthStateChanged((用户)=>{
如果(用户){
火基
.firestore()
.collection(`/userProfiles/${user.uid}/foodList`)
.get()
。然后(foodListSnapshot=>{
foodListSnapshot.forEach(快照=>{
食物列表({
foodName:snap.data().name,
mealConsumed:snap.data().mean,
estimatedCalories:snap.data().卡路里,
dateConsumed:snap.data().date
});
});
}).然后((食物列表)=>{
this.setState({data:foodList});
}).catch(错误=>console.log(错误));
}否则{
警报。警报(“用户未登录”);
}
});
这将使state
在该函数内部可用。您需要将function(user)
更改为(user)=>{}
,因为function()不绑定外部作用域(state)。所以它看起来像这样:
let foodList=[];
Firebase.auth().onAuthStateChanged((用户)=>{
如果(用户){
火基
.firestore()
.collection(`/userProfiles/${user.uid}/foodList`)
.get()
。然后(foodListSnapshot=>{
foodListSnapshot.forEach(快照=>{
食物列表({
foodName:snap.data().name,
mealConsumed:snap.data().mean,
estimatedCalories:snap.data().卡路里,
dateConsumed:snap.data().date
});
});
}).然后((食物列表)=>{
this.setState({data:foodList});
}).catch(错误=>console.log(错误));
}否则{
警报。警报(“用户未登录”);
}
});
这将使state
在该函数内部可用。尝试更改为:onAuthStateChanged((用户)=>{
。这样,函数将绑定外部作用域。@ischenkodv-你真是太棒了!过去几个小时我一直在为这个问题苦苦挣扎,非常感谢!我想你无法解释为什么手动绑定API调用时,这个解决方案确实起作用了?@Vilitaria函数函数(){}
不绑定外部作用域,而()=>{}
绑定外部作用域。这就是区别。请尝试更改为:onAuthStateChanged((用户)=>{
。这样,函数将绑定外部作用域。@ischenkodv-你真是太棒了!过去几个小时我一直在为这个问题苦苦挣扎,非常感谢!我想你无法解释为什么手动绑定API调用时,这个解决方案确实起作用了?@Vilitaria函数函数(){}
不绑定外部作用域,而()=>{}
绑定外部作用域。这就是区别。