首页 > 解决方案 > 获取后 setState 后地图不起作用

问题描述

有人可以解释为什么我的地图在模板中不起作用。

我尝试了 4 个小时,但没有得到有用的解决方案。

render() 在我从 firebase 获取所有数据之前有效

如果我尝试使用 setState Hook 或在我的情况下使用 setsalesList 钩子再次渲染地图,则模板不会再次渲染。

import React, { useState, useEffect } from "react";
import { Link } from "react-router-dom";
import NavBar from "./NavBar";
import { db } from "../firebase";
import { useAuth } from "../contexts/AuthContext";

const Sales = () => {
  const [isLoading, setIsLoading] = useState(true);
  const [salesList, setSalesList] = useState([]);
  const { currentUser } = useAuth();
  async function setupProject() {
    let salesDataList = [];
    await db
      .collection("users")
      .doc(currentUser.uid)
      .get()
      .then((userItemData) => {
        const userItem = userItemData.data();
        db.collection("projects")
          .doc(userItem.project[0])
          .get()
          .then((projectData) => {
            db.collection("sales")
              .where("project", "==", projectData.id)
              .get()
              .then((sales) => {
                sales.forEach((sale) => {
                  sale
                    .data()
                    .customer.get()
                    .then((customer) => {
                      let salesData = {
                        key: sale.id,
                        name: customer.data().name,
                        sold: sale.data().sold,
                        date:
                          new Date(sale.data().time.toDate()).getDate() +
                          "." +
                          new Date(sale.data().time.toDate()).getMonth() +
                          "." +
                          +new Date(sale.data().time.toDate()).getFullYear(),
                      };
                      salesDataList.push(salesData);
                      console.log(salesDataList);
                    });
                });
                setSalesList(salesDataList);
              })
              .finally(() => {});
          });
      });
    setIsLoading(false);
  }
  useEffect(() => {
    setupProject();
  }, []);
  return (
    <>
      <NavBar />
      <div className="header header-fixed header-logo-center">
        <a className="header-title">Verkäufe</a>
        <a href="https://huehnerpi.de/customer" className="header-icon">
          <i className="fas fa-user" />
        </a>
        <a
          href="https://huehnerpi.de/sales/newSale"
          className="header-icon header-icon-4"
        >
          <i className="fas fa-plus" />
        </a>
      </div>
      {isLoading ? (
        <div className="page-content header-clear-medium">
          <div
            className="content mt-0"
            style={{
              marginBottom: 16,
              marginLeft: 16,
              marginRight: 16,
            }}
          >
            <p>Lädt...</p>
          </div>
        </div>
      ) : (
        <div className="page-content header-clear-medium">
          <div
            className="card card-style"
            style={{
              marginBottom: "16px",
            }}
          >
            <div className="content mb-0">
              <div className="input-style input-style-always-active has-borders no-icon">
                <select
                  id="dropdownStatus"
                  style={{
                    color: "darkslategray",
                  }}
                >
                  <option value="all">Alle Status</option>
                </select>
                <span>
                  <i className="fa fa-chevron-down" />
                </span>
                <i className="fa fa-check disabled valid color-green-dark" />
                <em />
              </div>
              <div className="input-style input-style-always-active has-borders no-icon">
                <select
                  id="dropdownCustomer"
                  style={{
                    color: "darkslategray",
                  }}
                >
                  <option value="all">Alle Käufer</option>
                </select>
                <span>
                  <i className="fa fa-chevron-down" />
                </span>
                <i className="fa fa-check disabled valid color-green-dark" />
                <em />
              </div>
            </div>
          </div>
          {console.log(salesList.length)}
          {salesList.map((saleItem) => (
            <a
              key={saleItem.key}
              className="card card-style mb-3 filterDiv"
              style={{ display: "block" }}
            >
              <div className="content">
                <h3>
                  {saleItem.name} - {saleItem.sold} Eier
                  <span data-menu="menu-contact-2" style={{ float: "right" }}>
                    <span className="icon icon-xxs rounded-sm shadow-sm me-1 bg-red-dark">
                      <i className="fas fa-times" />
                    </span>
                  </span>
                  <span style={{ float: "right" }}>
                    <span className="icon icon-xxs rounded-sm shadow-sm me-1 bg-blue-dark">
                      <i className="fas fa-pen" />
                    </span>
                  </span>
                </h3>

                <div className="row mb-n2 color-theme">
                  <div className="col font-10 text-start">
                    <span className="badge bg-green-dark color-white font-10 mt-2">
                      Bezahlt
                    </span>
                  </div>
                  <div className="col font-10 text-end opacity-30">
                    <i className="fa fa-calendar pe-2" />
                    12.12.2020 <span className="copyright-year" />
                  </div>
                </div>
              </div>
            </a>
          ))}
        </div>
      )}
    </>
  );
};

export default Sales;

标签: javascriptreactjsfirebasedictionaryfetch

解决方案


这样,它现在对我有用!

我在我的 foreach 的最后一次迭代之后设置了状态

import {Link} from "react-router-dom";
import NavBar from "./NavBar";
import {db} from "../firebase"
import {useAuth} from "../contexts/AuthContext";

const Sales = () => {
    const [isLoading, setIsLoading] = useState(true);
    const [salesList, setSalesList] = useState([]);
    const { currentUser } = useAuth();
    function setupProject() {
        let salesDataList = [];
        db.collection("users").doc(currentUser.uid).get()
            .then(userItemData => {
                const userItem = userItemData.data();
                db.collection("projects").doc(userItem.project[0]).get()
                    .then(projectData => {
                        db.collection("sales").where("project", "==", projectData.id).get()
                            .then((sales) => {
                                let i = 0;
                                sales.forEach((sale) => {
                                    sale.data().customer.get()
                                        .then(customer => {
                                            let salesData = {
                                                key: sale.id,
                                                name: customer.data().name,
                                                sold: sale.data().sold,
                                                date: new Date(sale.data().time.toDate()).getDate() + "." + new Date(sale.data().time.toDate()).getMonth() + "." + + new Date(sale.data().time.toDate()).getFullYear(),
                                            };
                                            salesDataList.push(salesData)
                                            if (sales.size -1 === i++) {
                                                setSalesList(salesDataList);
                                                setIsLoading(false);
                                            }
                                        })
                                });
                            });
                    });
            });
    }
    useEffect(() => {
        setupProject();
    }, []);
    return(
        <>
            <NavBar />
            <div className="header header-fixed header-logo-center">
                <a className="header-title">Verkäufe</a>
                <a href="https://huehnerpi.de/customer" className="header-icon"><i className="fas fa-user"/></a>
                <a href="https://huehnerpi.de/sales/newSale" className="header-icon header-icon-4"><i className="fas fa-plus"/></a>
            </div>
            {isLoading ? (
                <div className="page-content header-clear-medium">
                    <div className="content mt-0" style={{
                        marginBottom: 16,
                        marginLeft: 16,
                        marginRight: 16
                    }}>
                        <p>Lädt...</p>
                    </div>
                </div>
            ) : (
            <div className="page-content header-clear-medium">
                <div className="card card-style" style={{
                    marginBottom: "16px"
                }}>
                    <div className="content mb-0">
                        <div className="input-style input-style-always-active has-borders no-icon">
                            <select id="dropdownStatus" style={{
                                color: "darkslategray"
                            }}>
                                <option value="all">Alle Status</option>
                            </select>
                            <span><i className="fa fa-chevron-down"/></span>
                            <i className="fa fa-check disabled valid color-green-dark"/>
                            <em/>
                        </div>
                        <div className="input-style input-style-always-active has-borders no-icon">
                            <select id="dropdownCustomer" style={{
                                color: "darkslategray"
                            }}>
                                <option value="all">Alle Käufer</option>

                            </select>
                            <span><i className="fa fa-chevron-down"/></span>
                            <i className="fa fa-check disabled valid color-green-dark"/>
                            <em/>
                        </div>
                    </div>
                </div>
                {salesList.length > 0 && console.log(salesList.length)}
                {salesList.map(saleItem => (
                    <a key={saleItem.key} className="card card-style mb-3 filterDiv" style={{display: "block"}}>
                        <div className="content">
                            <h3>{saleItem.name} - {saleItem.sold} Eier
                                <span data-menu="menu-contact-2" style={{float: "right"}}>
                            <span className="icon icon-xxs rounded-sm shadow-sm me-1 bg-red-dark">
                                <i className="fas fa-times"/>
                            </span>
                        </span>
                                <span style={{float: "right"}}>
                            <span className="icon icon-xxs rounded-sm shadow-sm me-1 bg-blue-dark">
                                <i className="fas fa-pen"/>
                            </span>
                        </span>
                            </h3>

                            <div className="row mb-n2 color-theme">
                                <div className="col font-10 text-start">
                                    <span className="badge bg-green-dark color-white font-10 mt-2">Bezahlt</span>
                                </div>
                                <div className="col font-10 text-end opacity-30">
                                    <i className="fa fa-calendar pe-2"/>12.12.2020 <span className="copyright-year"/>
                                </div>
                            </div>
                        </div>
                    </a>
                ))}
            </div>
            )}
        </>
    );
}

export default Sales;```

推荐阅读