Это действительно работает, как ожидалось. Поскольку все данные загружаются из Firestore асинхронно, они доступны только в обратном вызове. Таким образом, ваши вызовы setMeal
и setLoading
должны выполняться внутри этого обратного вызова.
Самый простой способ сделать это - вызвать setMeal
внутри l oop следующим образом:
useEffect(() => {
const subscriber = firestore()
.collection('Meal')
.onSnapshot((querySnapshot) => {
const meal = [];
querySnapshot.forEach(documentSnapshot => {
meal.push({
...documentSnapshot.data(),
//key: documentSnapshot.id,
});
setMeal(meal); // this is moved
const ingredient = [];
for (let i=0; i<documentSnapshot.data().Zutaten.length; i++) {
documentSnapshot.data().Zutaten[i].get().then(documentSnapshot => {
if (documentSnapshot.exists) {
console.log('ingredient data: ', documentSnapshot.data())
ingredient.push({
...documentSnapshot.data(),
//key: documentSnapshot.data().id,
});
};
})
setIngredient(ingredient);
}
});
setLoading(false);
});
С помощью этого кода вы теперь визуализируете блюдо каждый раз, когда добавляете к нему запись.
Обновление : если вы также визуализируете ингредиенты (я не видел этого в коде, которым вы поделились), вам нужно будет установить его в состояние внутри обратного вызова, в которое вы загружаете ингредиенты. .
useEffect(() => {
const subscriber = firestore()
.collection('Meal')
.onSnapshot((querySnapshot) => {
const meal = [];
querySnapshot.forEach(documentSnapshot => {
meal.push({
...documentSnapshot.data(),
//key: documentSnapshot.id,
});
setMeal(meal); // this is moved
const ingredient = [];
for (let i=0; i<documentSnapshot.data().Zutaten.length; i++) {
documentSnapshot.data().Zutaten[i].get().then(documentSnapshot => {
if (documentSnapshot.exists) {
console.log('ingredient data: ', documentSnapshot.data())
ingredient.push({
...documentSnapshot.data(),
//key: documentSnapshot.data().id,
});
};
setIngredient(ingredient); // move this too
})
}
});
setLoading(false);
});