代码之家  ›  专栏  ›  技术社区  ›  Demonix

React Firebase onSnapshot为映射函数返回null

  •  0
  • Demonix  · 技术社区  · 2 年前

    我想这是因为我 onSnapshot

    已筛选

    父组件:

    function KnifesComponent() {
      const knifeCollection = collection(db, "knives");
      const [knives, setKnives] = useState([]);
      const [count, setCount] = useState(0);
    
      const [filtered, setFiltered] = useState([]);
      const [activeFilter, setActiveFilter] = useState("");
    
      useEffect(() => {
          const sub = onSnapshot(knifeCollection, (snapshot) => {
            setKnives(snapshot.docs.map((doc) => ({ ...doc.data(), id: doc.id })));
            setFiltered(snapshot.docs.map((doc) => ({ ...doc.data(), id: doc.id })));
            const TotalSkins = snapshot.size;
            setCount(TotalSkins);
          });
          return () => {
            sub();
          }
      }, []);
    
      const rarities = {
        Exclusive: "Rarity_Exclusive.png",
        Ultra: "Rarity_Ultra.png",
        Premium: "Rarity_Premium.png",
        Deluxe: "Rarity_Deluxe.png",
      };  
    
      return (
        <div className="collection">
          <h2 className="section-heading">
            Knives <div className="count">({count})</div>
            <Filter
              skins={knives}
              setFiltered={setFiltered}
              activeFilter={activeFilter}
              setActiveFilter={setActiveFilter}
            />
          </h2>
            {filtered.map((skin) => {
              return (
                <div
                  layout
                  animate={{ opacity: 1 }}
                  initial={{ opacity: 0 }}
                  exit={{ opacity: 0 }}
                  className="skin-box"
                  key={skin.id}
                >
                  <div className="skin-rarity">
                    <Image src={require(`../../public/${rarities[skin.rarity]}`)} />
                  </div>
                  <h4>{skin.name}</h4>
                  <div className="skin-value">
                    <p>{skin.value}</p>
                  </div>
                </div>
              );
            })}
          <div className="clearfix"></div>
        </div>
      );
    }
    

    过滤器组件:

    function Filter({ setActiveFilter, activeFilter, setFiltered, skins }) {
      useEffect(() => {
        if (activeFilter === "") {
          setFiltered("");
          return;
        }
        const filtered = skins.filter((skin) => skin.rarity.includes(activeFilter));
        console.log(filtered)
        setFiltered(filtered);
      }, [activeFilter]);
    
      return (
        <div className="filter-container">
          <button
            className={activeFilter === [] ? "active" : ""}
            onClick={() => setActiveFilter([])}
          >
            All
          </button>
          <button
            className={activeFilter === "Ultra" ? "active ultra" : "ultra"}
            onClick={() => setActiveFilter("Ultra")}
          >
            Ultra
          </button>
          <button
            className={
              activeFilter === "Exclusive" ? "active exclusive" : "exclusive"
            }
            onClick={() => setActiveFilter("Exclusive")}
          >
            Exclusive
          </button>
          <button
            className={activeFilter === "Premium" ? "active premium" : "premium"}
            onClick={() => setActiveFilter("Premium")}
          >
            Premium
          </button>
          <button
            className={activeFilter === "Deluxe" ? "active deluxe" : "deluxe"}
            onClick={() => setActiveFilter("Deluxe")}
          >
            Deluxe
          </button>
        </div>
      );
    }
    

    1 回复  |  直到 2 年前
        1
  •  1
  •   Frank van Puffelen    2 年前

    这是问题的根源之一:

    if (activeFilter === "") {
      setFiltered("");
      return;
    }
    

    filtered 状态变量为空字符串,但所有其他代码(包括声明时 已筛选 在里面 useState 假设它是一个数组。

    我猜你想做:

    if (activeFilter === "") {
      setFiltered([]);
      return;
    }