【问题标题】:How to print/render in a table Firebase information REACT JS如何在表格中打印/渲染 Firebase 信息 REACT JS
【发布时间】:2021-09-15 19:07:31
【问题描述】:

在发帖之前,我总是在谷歌、youtube、论坛上搜索,或者尝试自己弄清楚,甚至查看其他人的类似问题,但我很遗憾地被卡住了。

所以我使用的是firestore数据库,用户可以创建一个“学生”,数据是firestore的保存如下:

它保存课程、名称、学校和创建它的人的 UID。到目前为止,我将这些信息导入到 firestore 没有问题,现在问题是将它带回表中,我不明白为什么没有被打印出来。

控制台日志正在打印所有学生 1 到 1 + 数组中的所有学生(原因正在遍历所有信息)

现在你可以看到桌子是空的!我不明白为什么! 非常沮丧

这是相关的代码片段:

  • 数据库部分:
useEffect(() => {
        db.collection('usuarios').doc(user.uid).collection('estudiantes')
        .get().then((snapshot) => {
                   (snapshot.forEach(doc => {
                      const data = doc.data();
                      estudiantes.push(data)
                      
                     console.log(doc.data());
                     console.log(estudiantes)
            }))
        })
    }, []);
  • 地图/渲染
<tbody>
                {estudiantes.map((e) => (

                        <tr >
                        <td>

                        <input onChange = {(event) => {
                            let checked = event.target.checked;
                        }} 
                        
                        type="checkbox" checked = "">
                        </input>
                        </td>

                        <td >{e.name}</td>
                        <td >{e.school}</td>
                        <td >{e.grade}</td>
                        <td></td>
                        </tr>
                     ))}
                </tbody>
  • 完整代码:
import React, { useState, useEffect } from 'react'
import { auth, db } from './firebase';
import "./ListadoEstudiantes.css"
import data from "./mock-data.json"
import { useHistory } from 'react-router-dom';
import { Checkbox } from '@material-ui/core';

function ListadoEstudiantes({user}) {

    const [contacts, setContacts] = useState(data);
    const history = useHistory("");

    const crearEstudiante = () => {
          history.push("/Crear_Estudiante");
      }

      const realizarPedidos = () => {
        history.push("/Crear_Pedidos");
    }
    
    const estudiantes = [];

    useEffect(() => {
        db.collection('usuarios').doc(user.uid).collection('estudiantes')
        .get().then((snapshot) => {
                   (snapshot.forEach(doc => {
                      const data = doc.data();
                      estudiantes.push(data)
                      
                     console.log(doc.data());
                     console.log(estudiantes)
            }))
        })
    }, []);

    return (
        <div className="listadoEstudiantes"> 
        <div className="estudiantes_container">
            <h1 className = "estudiantes_container_h1">Listado de estudiantes</h1>
            <button onClick={crearEstudiante} className = "crear_estudiante_boton">Crear Estudiantes</button>
            <h3 className = "estudiantes_container_h3">*Para realizar su pedido seleccione a los estudiantes</h3>
            <div className ="tableContainer">
            <table>
                <thead>
                    <tr className="Lista">
                        <th>
                            <input type="checkbox"></input>
                        </th>
                        <th>Nombre</th>
                        <th>Colegio</th>
                        <th>Grado</th>
                        <th>Accion</th>
                    </tr>
                </thead>
                <tbody>
                {estudiantes.map((e) => (

                        <tr >
                        <td>

                        <input onChange = {(event) => {
                            let checked = event.target.checked;
                        }} 
                        
                        type="checkbox" checked = "">
                        </input>
                        </td>

                        <td >{e.name}</td>
                        <td >{e.school}</td>
                        <td >{e.grade}</td>
                        <td></td>
                        </tr>
                     ))}
                </tbody>
            </table>
            </div>

            <div className="space" />
            <button onClick={realizarPedidos} className = "crear_estudiante_boton">Realizar Pedidos</button>
            <div className="space" />
      </div>

      </div>
    )
}

export default ListadoEstudiantes

我想就是这样,用户来自 Firestore 数据库,我导入的 数据 是我用来测试表(并且呈现没有问题)的假数据,可以被忽略。

这是它在假数据上的外观以及它在真实数据上的外观(这不起作用!:'3)

【问题讨论】:

    标签: javascript reactjs firebase google-cloud-firestore


    【解决方案1】:

    estudiantes 应该是组件的本地 state。因此,需要将其捕获为状态,并将其用于表格数据渲染,如下所示。

    setEstudiantes 是一个 setState 函数,它异步更新状态。因此,为了检查更新的状态,您需要在 render 方法中包含console.log("estudiantes: ", estudiantes)(而不是在setEstudiantes(tempData) 之后)。否则,您将无法看到更新后的状态。

    import React, { useState, useEffect } from "react";
    import { auth, db } from "./firebase";
    import "./ListadoEstudiantes.css";
    import data from "./mock-data.json";
    import { useHistory } from "react-router-dom";
    import { Checkbox } from "@material-ui/core";
    
    function ListadoEstudiantes({ user }) {
      const [contacts, setContacts] = useState(data);
      const [estudiantes, setEstudiantes] = useState([]);
      const history = useHistory("");
    
      const crearEstudiante = () => {
        history.push("/Crear_Estudiante");
      };
    
      const realizarPedidos = () => {
        history.push("/Crear_Pedidos");
      };
    
      useEffect(() => {
        db.collection("usuarios")
          .doc(user.uid)
          .collection("estudiantes")
          .get()
          .then((snapshot) => {
              const tempData = [];
            snapshot.forEach((doc) => {
              const data = doc.data();
              tempData.push(data);
    
              console.log(doc.data());
              console.log("Temp Data: ", tempData);
            });
            setEstudiantes(tempData);
          });
      }, []);
    
      console.log("estudiantes: ", estudiantes);
    
      return (
        <div className="listadoEstudiantes">
          <div className="estudiantes_container">
            <h1 className="estudiantes_container_h1">Listado de estudiantes</h1>
            <button onClick={crearEstudiante} className="crear_estudiante_boton">
              Crear Estudiantes
            </button>
            <h3 className="estudiantes_container_h3">
              *Para realizar su pedido seleccione a los estudiantes
            </h3>
            <div className="tableContainer">
              <table>
                <thead>
                  <tr className="Lista">
                    <th>
                      <input type="checkbox"></input>
                    </th>
                    <th>Nombre</th>
                    <th>Colegio</th>
                    <th>Grado</th>
                    <th>Accion</th>
                  </tr>
                </thead>
                <tbody>
                  {estudiantes.map((e) => (
                    <tr>
                      <td>
                        <input
                          onChange={(event) => {
                            let checked = event.target.checked;
                          }}
                          type="checkbox"
                          checked=""
                        ></input>
                      </td>
    
                      <td>{e.name}</td>
                      <td>{e.school}</td>
                      <td>{e.grade}</td>
                      <td></td>
                    </tr>
                  ))}
                </tbody>
              </table>
            </div>
    
            <div className="space" />
            <button onClick={realizarPedidos} className="crear_estudiante_boton">
              Realizar Pedidos
            </button>
            <div className="space" />
          </div>
        </div>
      );
    }
    
    export default ListadoEstudiantes;
    

    【讨论】:

    • 没错。更好地研究更多关于 state 和 props 在 react 中的处理,如果你在 react 上工作更多,这将派上用场。
    • 是的,我刚开始自学,我往往会陷入非常具体的事情,这有点麻烦,但正在学习中。
    • 是的,可以将从后端获取的数据保存在 cookie、本地存储或 sessio 存储中(检查是否存在差异)。但是在您的情况下,您正在获取可以在数据库中更新的数据。如果您在存储数据的整个生命周期内将它们保存在浏览器存储中,那么您将无法捕获数据库存储数据中发生的更改。
    • 因此,您可以使用加载器,直到数据检索完成。然后您将不会看到一个空表,而是一个加载器,它会在您的应用程序加载数据之前显示。您可以拥有antd 或material-ui 库表组件。它带有一个嵌入式加载程序。在开发 React 应用程序时,这样的库会让你的生活更轻松。
    • 非常感谢,我会期待当我完成这个应用程序时,我还有很多东西要学。我以前使用过材质 UI 库,但只用于图标和那种事情,从来没有考虑过使用表格。
    猜你喜欢
    • 2017-01-19
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多