即使数据没有改变,useEffect也会多次渲染

2024-04-05

如果依赖项数组为空,则此 useEffect 将渲染一次,但如果我将folderRef 放入依赖项数组,则此 useEffect 将渲染多次。我只想在添加或删除某些文件夹时渲染组件。请帮忙

  import React, { useState, useEffect , useRef } from "react";
import { db } from "../firebase";
import { collection, getDocs } from "firebase/firestore";
import FolderData from "./FolderData";

function ShowFolder(props) {
  const [folders, setFolders] = useState([]);
  const folderRef = useRef(collection(db, "folders"));

  useEffect(() => {
    const getData = async () => {
      const data = await getDocs(folderRef.current);
      const folderData = data.docs.map((doc) => {
        return { id: doc.id, data: doc.data() };
      });
      console.log(folderData);
      setFolders(folderData);
    };
    getData();
  }, [folderRef]);

  return (
    <div className="container md:px-4 mx-auto py-10">
      <div className="md:grid lg:grid-cols-6 md:grid-cols-3 mlg:grid-cols-3 md:gap-10 space-y-6 md:space-y-0 px-1 md:px-0 mx-auto">
        {folders.map((folder) => {
          return (
            <div key={folder.id}>
              {folder.data.userId === props.userId && (
                <div>
                  <FolderData key={folder.id} folder={folder} />
                </div>
              )}
            </div>
          );
        })}
      </div>
    </div>
  );
}

export default ShowFolder;

你重新声明folderRef每个渲染周期,所以如果你将它包含在useEffecthook 的依赖数组它将触发渲染循环。

如果你不参考folderRef组件中的任何其他位置,然后将其移动into the useEffect挂钩回调以将其作为外部依赖项删除。

const [folders, setFolders] = useState([]);

useEffect(() => {
  const folderRef = collection(db, "folders");

  const getData = async () => {
    const data = await getDocs(folderRef);
    const folderData = data.docs.map((doc) => {
      return { id: doc.id, data: doc.data() };
    });
    console.log(folderData);
    setFolders(folderData);
  };

  getData();
}, []);

或者将其存储在 React ref 中,以便可以将其安全地称为稳定引用。

const [folders, setFolders] = useState([]);
const folderRef = useRef(collection(db, "folders"));

useEffect(() => {
  const getData = async () => {
    const data = await getDocs(folderRef.current);
    const folderData = data.docs.map((doc) => {
      return { id: doc.id, data: doc.data() };
    });
    console.log(folderData);
    setFolders(folderData);
  };

  getData();
}, [folderRef]);

Update

我了解到您正在更新folders在应用程序的其他地方收集并希望此组件“侦听”这些更改。为此,您可以实施onSnapshot听众。

它可能类似于以下内容:

const [folders, setFolders] = useState([]);

useEffect(() => {
  const unsubscribe = onSnapshot(
    collection(db, "folders"),
    (snapshot) => {
      const folderData = [];
      snapshot.forEach((doc) => {
        folderData.push({
          id: doc.id,
          data: doc.data(),
        });
      });
      setFolders(folderData);
    },
  );

  // Return cleanup function to stop listening to changes
  // on component unmount
  return unsubscribe;
}, []);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使数据没有改变,useEffect也会多次渲染 的相关文章

随机推荐

  • 闪亮的滑块限制释放鼠标左键的反应

    我正在使用 Shiny 应用程序 其中可能需要一些时间才能将滑块设置为正确的值 因此 在尝试将滑块设置为正确的值 并且不释放鼠标左键 时 即我的本地 服务器观察到几个新值并做出相应反应 由于我的服务器对任何新值的响应可能需要几秒钟 如果我可
  • 有没有一种方法可以有效地生成包含数百万个文件的目录中的每个文件?

    我知道os listdir 但据我所知 它将目录中的所有文件名放入内存 然后返回列表 我想要的是一种生成文件名 对其进行处理 然后生成下一个文件名的方法 而不会将它们全部读入内存 有什么办法可以做到这一点吗 我担心使用这种方法更改文件名 添
  • Rails 4.0 中的多个“root to”路线

    我试图让 Rails 根据子域转到不同的控制器 action 这就是我迄今为止在routes rb中所拥有的 Petworkslabs Application routes draw do get to custom show constr
  • R 并排分组箱线图

    我有两种植物气体排放的时间数据 这两种植物都经过了相同的处理 和一些以前的帮助 https stackoverflow com questions 23848186 unify boxplot factor group colours 23
  • Oauth 2.0 - 单个资源服务器但多个客户端应用程序

    问候 我想问以下是否是 Oauth 2 0 的有效用例 授权服务器 单独 单个 或多个 资源服务器 多个客户端应用程序访问同一资源服务器 如果这是一个有效的用例 我们如何使用授权服务器配置多个客户端 无法使用 application pro
  • 如何用 SUBSTITUTE 公式替换 Excel 中的引号?

    我有工作表 其中需要命名范围来对应于另一个单元格的内容 单元格中的文本类似于 Partitions w Studs 16 oc 命名范围不能包含空格 或者最重要的是 不能包含 等特殊字符 因此 该范围的命名如下 PartitionswStu
  • clojure lein(读取行)stdin 问题

    所以常规的 clojure repl 工作得很好 read line 收集输入 然后回显它 使用lein repl但是 它永远不会回显任何输入字符 也不允许我从任何标准输入读取命令返回 我确信这与重新绑定有关in 但想知道是否有解决方法 修
  • Tablayout+view 分页器未在位置 0 显示片段

    我的应用程序有 2 个选项卡 具有两种不同的布局 当我运行应用程序时 应该在 tab1 位置 0 中显示的片段显示在 tab2 中 而应该在 tab2 位置 1 中显示的片段没有显示 此外 当我滑动屏幕时 选项卡布局中的选项卡焦点不会改变
  • PDF - 设置受密码保护的打印、复制、粘贴选项?

    我正在寻找一个 Python 库 它允许我在现有 PDF 文件上设置受密码保护的打印 复制 粘贴选项 我尝试过的 我查看了reportlab pdfencrypt模块 这正是我需要的选项 但是开源版本受到严格限制 甚至无法设置真正的密码 并
  • iOs(CoreLocation)-locationManager:didUpdateLocations:未按预期工作

    我编写了一个简单的 iPhone 应用程序 用于检索位置信息并简单地显示它们 我想增加distanceTraveled每次位置改变时都会变量 我的问题是在方法中locationManager CLLocationManager manage
  • 对.net中多重继承的质疑

    我们知道 net中所有的类都是继承自对象类的 假设我们创建一个名为 ClassA 的类 然后我们创建另一个类 名为ClassB 它继承自ClassA 这不是多重继承吗 因为ClassB同时继承自Object类和ClassA 这不是违反了C
  • 如何以编程方式从 Office 文件中提取和操作图像?

    如何从 PowerPoint 和 Word 文档中提取一些图像 以便对其进行操作 然后将图像放回 MS Office 文件中 Apache 有一个名为 POI 的项目 专门用于与 Java 中的 MS Office 格式进行交互 希望这对你
  • 从 cygwin bash 成功克隆后,本地 Git 存储库不存在

    当我克隆到通过绝对路径引用的目录 不存在 时 git 不会抱怨任何事情 报告 0 退出代码 但目录是not创建的 Git 遵守目录do当我重试时存在 user host tmp git clone https github com zand
  • com.mongodb.MongoSocketOpenException:打开套接字时出现异常(MongoDB、Docker)

    我尝试使用 docker 映像启动我的应用程序 Spring Boot Spring Cloud Eureka MongoDB 但无法连接到 MongoDB 例外 exception com mongodb MongoSocketOpenE
  • 解决电力塔

    a 2 Power 10 6 10 9 3 Power 4 9 7 5 TwoTower n Nest 2 1 n 最小的是什么n这样TwoTower n gt a This question http www quora com How
  • 如何给 git 仓库命名?

    我正在使用这些命令创建远程仓库 mkdir NewRepo cd NewRepo git init 然后我将此存储库克隆到本地 git clone user server path to app git 这对我有用 但我想给仓库命名 像其他
  • 我如何监听所有具有参数化名称的 Seam 上下文事件?

    接缝会起火不同类型的事件 http docs jboss org seam latest reference en US html events html d0e5252与特定范围 任务或流程相关 并将范围 任务或流程的名称附加到事件末尾
  • 获取两个给定日期之间的 SUM

    如果我想获得一定日期范围内的总消耗量 我该怎么做 我想我可以这样做 SELECT id SUM consumption FROM consumption info WHERE date time BETWEEN 2013 09 15 AND
  • 在 Java 中使用 Visual Studio Code 的 Azure Functions 项目

    我正在尝试使用 VSCode 创建 azure 函数并将其部署到 azure 我按照官方文档的描述进行操作 https learn microsoft com en us azure azure functions functions cr
  • 即使数据没有改变,useEffect也会多次渲染

    如果依赖项数组为空 则此 useEffect 将渲染一次 但如果我将folderRef 放入依赖项数组 则此 useEffect 将渲染多次 我只想在添加或删除某些文件夹时渲染组件 请帮忙 import React useState use