当前位置: 首页 > 知识库问答 >
问题:

React Hooks:useffect()被调用两次,即使将空数组用作参数也是如此

魏英勋
2023-03-14


我是reactJS新手,正在编写代码,以便在从DB加载数据之前,它将显示加载消息,然后在加载之后,使用加载的数据呈现组件。为此,我同时使用了useState钩子和useEffect钩子。代码如下:

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

下面是我编写的代码:

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;

有人能帮我理解为什么要调用两次,以及如何正确地修复代码吗?非常感谢你!

共有3个答案

东门城
2023-03-14

我使用这个作为我的替代use焦点效应。我使用了嵌套的反应导航堆栈,如选项卡和抽屉,使用使用效果重构对我来说并不像预期的那样有效。

import React, { useEffect, useState } from 'react'
import { useFocusEffect } from '@react-navigation/native'

const app = () = {

  const [isloaded, setLoaded] = useState(false)


  useFocusEffect(() => {
      if (!isloaded) {
        console.log('This should called once')

        setLoaded(true)
      }
    return () => {}
  }, [])

}

此外,还有一个实例,您可以在屏幕上导航两次。

尉迟招
2023-03-14

您很可能正在启用严格模式的开发环境中检查此问题。要验证这种情况,请搜索

严格模式不能自动为您检测副作用,但它可以通过使副作用更具确定性来帮助您发现副作用。这是通过故意双重调用以下函数来实现的:

  • 传递给useState、useMemo或useReucer的函数
  • [...]

严格模式-反应JS文档

这里类似的问题是,由于严格模式,我的React组件渲染了两次

陆展
2023-03-14

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

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

如果日志“我开火一次”被触发不止一次,这意味着你的问题是两件事之一。

这个应该是显而易见的,你的组件在页面中出现了几次,每一次都将挂载并运行使用效果

组件在其初始渲染时被强制卸载和重新装载。这可能有点像树上发生的“关键”变化。您需要使用此useEffect提升每个级别,直到它只渲染一次。然后您应该能够找到原因或重新装载。

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

这个答案由@johnhendix指出,由@rangfu撰写,请参阅链接,如果这是你的问题,请给他一些爱。

 类似资料:
  • 我的react组件的构造函数被调用了两次,但我不知道为什么。我正在使用react redux存储我的应用程序的语言。我有一个基于浏览器语言设置默认语言的函数。LoginPage是第一个获得render的组件,因此我在其构造函数中调用了我的函数。基本上,它所做的就是比较并分派一个动作。当我用redux开发工具检查我的状态时,我看到它被调度了两次。我在构造函数中打印了虚拟数据,它也打印了两次。 登录页

  • 假设我们有一个函数和另一个函数 我们希望编写一个Unit测试,检查是否调用了的次数和正确的参数。 那里有 但这只是指最后一次通话。所以假设调用,然后,调用的断言是。 此外,还有 这将生成一个包含正确参数的对象列表。将这个列表与我们在单元测试中创建的对象进行比较,感觉是一件非常讨厌的事情<代码>调用似乎是模拟库的一个内部类。 有更好的方法吗?我使用这个设置来测试函数的并行执行。

  • 问题内容: 我在Go中关注一个简单的Web服务器示例。 我插入了一条语句,使生成的代码如下所示: 问题是,每当我在Web浏览器中加载端口8000时,此函数就会被调用两次。这是一个问题,因为我打算在每次页面访问时增加一个计数器。通过这种行为,计数器将增加两次。OTOH,如果我这样做,它只会被调用一次。 我觉得我在这里失踪真的很愚蠢。 问题答案: 只需记录请求。您将意识到您的浏览器还请求/favico

  • 编辑:由于代码剪贴不会重现错误-这里有一个指向github repo的链接:(代码远未完成) https://github.com/altruios/clicker-game 我现在已经在两台计算机上运行了它——这两台计算机都有相同的行为,而代码剪报并没有显示出来。 因此,我正在构建一个clicker游戏来学习react,我不明白为什么这段代码会以这种方式运行: 在主应用程序中,我有以下功能: 那

  • 问题内容: 假设我有以下HQL 似乎不起作用。是否有人只使用一个参数就可以解决此问题? 问题答案: 这用于将值绑定到命名参数。但是名称可以在查询中多次出现,这无关紧要。因此,请检查一次您是否确实有该查询的数据。 在此处查看文档 该文档中的一些主要文字 命名查询参数是查询字符串中形式为:name的标记。 通过调用setParameter(“ foo”,foo,Hibernate.INTEGER);将

  • 当我多次调用同一个函数时,每次都传递了不同的参数,我会这样做: 有没有更方便的方法做到这一点呢?