基本上,我有React组件,它从Firestore获取数据,并将数据存储在items数组中。之后,我将呈现组件中的所有数据。我目前的问题是menus有3个空数组,我不知道为什么.它们也被呈现到页面上。
首先,我有一个异步函数来获取数据,但是我用unsubscribe const将其更改为一个普通函数。Firestore提供了一个unscubscribe()函数,它在调用监听器时删除监听器。我想也许getMenu() get被多次调用,这就是为什么我有空数组,但它并没有解决我的问题.
现在我被这个问题困住了,如果有人能帮忙,我会很感激的。
import { collection, getDocs, onSnapshot, orderBy, query } from 'firebase/firestore';
import React, { useState, useEffect, Fragment } from 'react'
import { db, firebaseApp } from '../../firebase'
export default function Speisekarte() {
const [menus, setMenus] = useState([]);
const [loading, setLoading] = useState(false);
console.log(menus); // line 10: gives me 3 empty arrays and one filled array in the console
function getMenu(){
setLoading(true)
const docRef = query(collection(db, "meals"), orderBy("id", "asc"));
const unsubscribe = onSnapshot(docRef, (querySnapshot) => {
const items = [];
querySnapshot.forEach((doc) => {
items.push(doc.data());
});
setMenus(items);
});
setLoading(false);
unsubscribe();
}
useEffect(() => {
getMenu();
},[]);
return (
<section className="menu">
<div className="menu__container">
<h1 className="menu__container__title">Menu</h1>
{menus.map((item) => {
const keys = Object.keys(item);
return (
<Fragment key={item.title}>
<h2>{item.title}</h2>
<div className="menu__container__item">
{keys.map((gericht) => (
<article className="menu__container__item-article" key={item[gericht].id}>
<div className="menu__container__item-article__row">
<h3 className="menu__container__item-article__title">{item[gericht].title}</h3>
<span className="menu__container__item-article__price">{item[gericht].price}</span>
</div>
<p className="menu__container__item-article__info">
{item[gericht].desc}
</p>
</article>
))}
</div>
</Fragment>
);
})}
</div>
</section>
);
}控制台日志:
Array [] speisekarte.js:10:12
Array [] speisekarte.js:10:12
Array [] speisekarte.js:10:12
Array [ {…}, {…} ] speisekarte.js:10:12app.js
import React from 'react';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
import { AuthProvider } from './contexts/AuthContext';
import Navbar from './components/Navbar';
import Footer from './components/footer';
import Home from './pages/home'
import Speisekarte from './pages/speisekarte'
import Gallery from './pages/gallery'
import Kontakt from './pages/contact'
import Impressum from './pages/impressum';
import Signin from './pages/Signin';
import Admin from './pages/admin'
import './Sass/app.scss'
function App() {
return (
<AuthProvider>
<div id="main">
<Router>
<Navbar />
<Switch>
<Route path="/" exact component={Home} />
<Route path="/gallerie" component={Gallery} />
<Route path="/kontakt" component={Kontakt} />
<Route path="/impressum" component={Impressum} />
<Route path="/speisekarte" component={Speisekarte} />
<Route path="/signin" component={Signin} />
<Route path="/admin" component={Admin} />
</Switch>
<Footer />
</Router>
</div>
</AuthProvider>
);
}
export default App;发布于 2021-08-20 08:20:07
每次状态发生变化时,都会重新呈现其组件。在上述情况下,加载状态会发生变化,此时菜单仍然是空的,因此它正在记录一个空数组。
但是在从消防局中取出数组之后。再次反应,重新呈现组件,并将获取的数组记录到菜单中。
这就是为什么每次状态发生变化时都是控制台记录的原因。
https://stackoverflow.com/questions/68858695
复制相似问题