Javascript React Native:使用;“设置状态”;有希望

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

我试图根据通过API检索的数据更新React组件的状态。但是,我无法在承诺中使用setState函数,因为React Native始终返回以下错误“Type error:_this2.setState不是函数”。以下是我如何努力实现以下目标:

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函数
函数(){}
不绑定外部作用域,而
()=>{}
绑定外部作用域。这就是区别。