首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个反应组件被渲染了4次?

为什么这个反应组件被渲染了4次?
EN

Stack Overflow用户
提问于 2021-08-20 07:51:01
回答 1查看 1.1K关注 0票数 1

基本上,我有React组件,它从Firestore获取数据,并将数据存储在items数组中。之后,我将呈现组件中的所有数据。我目前的问题是menus有3个空数组,我不知道为什么.它们也被呈现到页面上。

首先,我有一个异步函数来获取数据,但是我用unsubscribe const将其更改为一个普通函数。Firestore提供了一个unscubscribe()函数,它在调用监听器时删除监听器。我想也许getMenu() get被多次调用,这就是为什么我有空数组,但它并没有解决我的问题.

现在我被这个问题困住了,如果有人能帮忙,我会很感激的。

代码语言:javascript
复制
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>
      );
}

控制台日志:

代码语言:javascript
复制
Array [] speisekarte.js:10:12
Array [] speisekarte.js:10:12
Array [] speisekarte.js:10:12
Array [ {…}, {…} ] speisekarte.js:10:12

app.js

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

发布于 2021-08-20 08:20:07

每次状态发生变化时,都会重新呈现其组件。在上述情况下,加载状态会发生变化,此时菜单仍然是空的,因此它正在记录一个空数组。

但是在从消防局中取出数组之后。再次反应,重新呈现组件,并将获取的数组记录到菜单中。

这就是为什么每次状态发生变化时都是控制台记录的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68858695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档