React Hooks:即使使用空数组作为参数,useEffect() 也会被调用两次

2023-11-24

我正在编写代码,以便在从数据库加载数据之前,它将显示加载消息,然后在加载后,使用加载的数据渲染组件。为此,我同时使用 useState 挂钩和 useEffect 挂钩。这是代码:

问题是,当我检查 console.log 时,useEffect 被触发两次。因此,代码会两次查询相同的数据,这是应该避免的。

下面是我写的代码:

import React from 'react';
import './App.css';
import {useState,useEffect} from 'react';
import Postspreview from '../components/Postspreview'

const indexarray=[]; //The array to which the fetched data will be pushed

function Home() {
   const [isLoading,setLoad]=useState(true);
   useEffect(()=>{
      /*
      Query logic to query from DB and push to indexarray
      */
          setLoad(false);  // To indicate that the loading is complete
    })
   },[]);
   if (isLoading===true){
       console.log("Loading");
       return <div>This is loading...</div>
   }
   else {
       console.log("Loaded!"); //This is actually logged twice.
       return (
          <div>
             <div className="posts_preview_columns">
             {indexarray.map(indexarray=>
             <Postspreview
                username={indexarray.username}
                idThumbnail={indexarray.profile_thumbnail}
                nickname={indexarray.nickname}
                postThumbnail={indexarray.photolink}
             />
             )}
            </div>
         </div>  
         );
    }
}

export default Home;

为什么它被调用两次,以及如何正确修复代码?


将console.log放入useEffect中

可能您还有其他副作用导致组件重新渲染,但 useEffect 本身只会被调用一次。您可以通过以下代码确定这一点。

useEffect(()=>{
      /*
      Query logic
      */
      console.log('i fire once');
},[]);

如果日志“我触发一次”被多次触发,则意味着您的问题是 三件事之一。

该组件在您的页面中出现多次

这一点应该是显而易见的,您的组件在页面中出现了几次,并且每个组件都会安装并运行 useEffect

树上更高的东西正在卸载和重新安装

该组件在其初始渲染时被迫卸载并重新安装。这可能类似于树上层发生的“关键”变化。您需要使用此 useEffect 提升每个级别,直到它仅渲染一次。那么你应该能够找到原因或重新安装。

React.Strict 模式已开启

StrictMode 会渲染组件两次(在开发中,而不是在生产中),以便检测代码中的任何问题并向您发出警告(这可能非常有用)。

这个答案是由@johnhendirx指出并由@rangfu撰写的,请参阅link如果这是你的问题,请给他一些爱。如果您因此遇到问题,通常意味着您没有将 useEffect 用于其预期目的。您可以在文档中阅读有关此内容的一些重要信息here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React Hooks:即使使用空数组作为参数,useEffect() 也会被调用两次 的相关文章

随机推荐

  • 简单的去抖动例程

    您是否有一个简单的去抖例程可以方便地处理单个开关输入 这是一个简单的裸机系统 没有任何操作系统 我想避免具有特定计数的循环构造 因为处理器速度可能会波动 我想你可以在这里学到很多东西 http www ganssle com debounc
  • 如何忽略数组解构中的某些返回值?

    当我只对索引 0 之外的数组值感兴趣时 在数组解构时是否可以避免声明无用的变量 在下文中 我想避免声明a 我只对索引 1 及以后感兴趣 How can I avoid declaring a const a b rest 1 2 3 4 5
  • 如何使用 Node.js 抓取包含动态内容的页面?

    我正在尝试刮一个website但我没有得到一些元素 因为这些元素是动态创建的 我在node js中使用cheerio 我的代码如下 var request require request var cheerio require cheeri
  • 如何在coldfusion中使用CFQuery执行2个或多个插入语句?

    是否可以使用执行 2 个插入或更新语句cfquery 如果是的话怎么办 如果不是 在 Coldfusion 中执行多个查询的最佳方法是什么 即仅打开一个到数据库的连接 我想每次我们打电话cfquery我们正在打开新的连接数据库 是否可以执行
  • Ember、Ember 数据和 MongoDB 的 _id

    我已经看到有人讨论过这个问题 但我仍然对处理 Mongo 的问题有疑问 id into id 我使用 mongoose 作为我的 ORM 虽然它有虚拟 但我似乎无法让它正常工作 以下是我的猫鼬模型中的内容 尝试从后端修复 mongoose
  • 如何在列表视图中实现OnScrollListener?

    我从服务器获取 500 条记录 我想在列表视图中显示 10 个项目 当列表视图到达末尾时我需要加载另外 10 个项目 依此类推 我在网上看到了很多例子 但我无法解决它 请帮助我 这是我的代码 public void onCreate Bun
  • C# 泛型继承和协变第 2 部分

    这是我的原始线程 C 泛型继承和协变 仅在我的只读界面上 我希望继承起作用 public delegate Boolean EnumerateItemsDelegate
  • 包包含同名的对象和包

    我在使用 Maven 或 Eclipse 编译一些 Scala 时遇到问题 我尝试从包含命名空间和同名类的 Java jar 导入一个类 我可以编译scalac 然而 例如 Java 项目 jar 包含 src foo bar java s
  • 如何在 Node.js Web 应用程序中管理 MongoDB 连接?

    我正在使用节点 mongodb native用MongoDB驱动写一个网站 我对如何管理连接有一些疑问 仅使用一个 MongoDB 连接来处理所有请求是否足够 是否存在任何性能问题 如果没有 我可以设置一个全局连接以在整个应用程序中使用吗
  • Xcode 4.2 无法调试 iOS 4.2.1 (8C148)

    我最近更新到 Xcode 4 2 我还将我的新 iPad 2 和 iPod 最新一代 更新到了 iOS 5 我构建了我的应用程序并且可以毫无问题地调试它们 我运行 iOS 4 2 1 8C148 的旧版 iPod 无法运行 也没有出现任何错
  • Firebase BigQuery 服务器偏移时间

    背景 我正在将 Firebase 分析数据导出到 BigQuery 我正在使用 cron 作业来处理 BigQuery 中的数据以获得洞察力 Problem 为了能够只处理增量数据 即自上次运行 cron 作业以来到达的数据 我需要一种方法
  • .htaccess URL 重写挑战

    我在某些 URL 重写方面遇到问题 下面的所有内容都工作正常 但我需要添加一条从 URL 中删除查询字符串的规则 site com page a b会变成site com page 有人可以帮忙吗 我已经阅读了一些关于 htaccess 的
  • 如何在Nuxt SSR模式下更改页面的URL而不重新加载整个页面?

    我正在尝试构建一个主详细信息视图 其中列表和详细信息在桌面上并排显示 但在移动设备上的不同页面上显示 如下图所示 我的列表中可能有 500 到 10000 个项目要显示 我用 10000 个项目模拟了这两种方法 请随意更改 server a
  • 如何使用 Java 类运行 Hadoop?

    我正在关注这本书Hadoop 权威指南 我对示例 3 1 感到困惑 有一个 Java 源文件 URLCat java 我用javac将其编译为 URLCat class 然后使用jar把它包进罐子里 书上说要用 hadoop URLCat
  • 使用 PyEphem 计算阴影长度

    我正在使用 PyEphem 并想要计算阴影的长度 假设一根单位长度的棍子种植在地上 长度由 cot phi 给出 其中 phi 是太阳高度角 如果我错了 请纠正我 我不知道在太阳上使用什么场 在下面的示例中 我使用角度 alt import
  • Freemarker 中的默认转义

    在 Freemarker 模板中 我们可以使用 escape 指令自动将转义应用于包含的块内的所有插值 lt escape x as x html gt lt name is escaped as html gt Hallo name 有没
  • 在 Python 3 中使用 urllib 的套接字资源警告

    我正在使用 urllib request urlopen 从我正在尝试测试的网络服务中获取数据 这会返回一个 HTTPResponse 对象 然后我通过 read 来获取响应正文 但我总是在 socket py 中看到有关未关闭套接字的 R
  • 错误:请求的资源需要用户身份验证:在 AzureCLI 任务构建管道中

    我无法从 azureCLI 任务触发 azure 管道构建 Task task AzureCLI 2 inputs azureSubscription Free Trial My subscription scriptType pscore
  • 上下文或活动之外的 getString

    我找到了R string对于将硬编码字符串保留在我的代码之外来说非常棒 并且我想继续在实用程序类中使用它 该实用程序类与我的应用程序中的模型一起使用以生成输出 例如 在本例中 我从活动之外的模型生成一封电子邮件 是否可以使用getStrin
  • React Hooks:即使使用空数组作为参数,useEffect() 也会被调用两次

    我正在编写代码 以便在从数据库加载数据之前 它将显示加载消息 然后在加载后 使用加载的数据渲染组件 为此 我同时使用 useState 挂钩和 useEffect 挂钩 这是代码 问题是 当我检查 console log 时 useEffe