Я хотел бы знать, возможно ли вернуть значение onSnapshot из одного файла в другой, может быть, пример поможет.
Это мой файл firebase-dishes-crud.js
const listenRealTimeDishes = () => {
firebase
.firestore()
.collection("dishes")
.onSnapshot((dishes) => {
let dishesAux = [];
dishes.forEach((dish) => {
dishesAux.push({ id: dish.id, ...dish.data() });
});
return dishesAux;
});
};
И это в моем файле блюда-список.js.
const [dishes, setDishes] = useState([])
useEffect(() => {
setDishes(dishesCrud.listenRealTimeDishes());}
,[]);
return (
<ul>
{dishes.map((dish)=>(
<li>{dish.price}</li>
)}
</ul>
)
Очевидно, это не работает, но я хочу знать, есть ли способ добиться чего-то подобного.
Вы не можете вернуть данные, загруженные асинхронно. Вызов setDishes
должен происходить внутри обратного вызова onSnapshot
.
Один простой способ сделать это — передать этот обратный вызов вашей функции listenRealTimeDishes
:
useEffect(() => {
dishesCrud.listenRealTimeDishes(setDishes));
},[]);
И затем вызовите его оттуда:
const listenRealTimeDishes = (setDishes) => {
firebase
.firestore()
.collection("dishes")
.onSnapshot((dishes) => {
let dishesAux = [];
dishes.forEach((dish) => {
dishesAux.push({ id: dish.id, ...dish.data() });
});
setDishes(dishesAux);
});
};