我是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;
有人能帮我理解为什么要调用两次,以及如何正确地修复代码吗?非常感谢你!
我使用这个作为我的替代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 () => {}
}, [])
}
此外,还有一个实例,您可以在屏幕上导航两次。
您很可能正在启用严格模式的开发环境中检查此问题。要验证这种情况,请搜索
严格模式不能自动为您检测副作用,但它可以通过使副作用更具确定性来帮助您发现副作用。这是通过故意双重调用以下函数来实现的:
严格模式-反应JS文档
这里类似的问题是,由于严格模式,我的React组件渲染了两次
可能还有其他副作用导致组件重新渲染,但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);将
当我多次调用同一个函数时,每次都传递了不同的参数,我会这样做: 有没有更方便的方法做到这一点呢?