各位早上好,,
我刚完成React的培训,我想做一个项目来练习。首先,我只是在firebase数据库中发布数据。然后,我想使用钩子(useState和useEffect)获取数据并将其显示在react组件中。
问题是,在使用axios获取数据后,我最终陷入了经典的无限循环陷阱,但我不知道如何使用依赖性来阻止它。
请查找以下代码:
import React, {useState} from 'react'
import {useEffect} from 'react'
import classes from './Incomes.module.css'
import axios from '../../../axios'
import Button from '../../UI/Button/Button'
import Input from '../../UI/Input/Input'
const Incomes = (props) => {
const [inputValue, setInputValue] = useState('');
const [fetchedTypes, setFetchedTypes] = useState([]);
const onClickHandler = () => {
const type = {type: inputValue}
axios.post('/types.json', type)
.then(response => {
alert('ok c good');
})
.catch(error => console.log(error))
}
const onChangeHandler = (event) => {
setInputValue(event.target.value)
}
useEffect(() => {
axios.get('/types.json')
.then(response => {
let types = []
for(let key in response.data) {
types.push({...response.data[key], id: key})
}
console.log('types : ', types)
setFetchedTypes(prevFetchedTypes => [...prevFetchedTypes, types])
})
.catch(error => console.log(error))
console.log('fetchedtypes', fetchedTypes)
}, [fetchedTypes])
return (
<div className={classes.Incomes}>
<h2>Paramètres des entrées</h2>
<h3>Ajouter un type de revenu</h3>
<Input type="text" disabled={false} change={onChangeHandler} placeholder="Nom du champ"></Input>
<Button onClick={onClickHandler} type="Normal" clicked={onClickHandler}>Ajouter</Button>
<h3>Liste des types de revenus disponibles</h3>
</div>
)
}
export default Incomes;
当我使用控制台日志类型时,数据是正确的。但当我控制台记录fetchedTypes时,它是一个空数组。
我找到了这篇文章,但它也不起作用:React-useffect-infinite-loop-fetch-data-axios
我不确定这是否是我使用use效果的方式或更新状态的方式的问题,或者两者兼而有之。
谢谢你的帮助
祝您今天过得愉快
你得到一个无限循环的原因是因为你的使用效果
和两个原因。
finchedTypes
不是一个基元,而是一些对象/数组,所以每次都会不同。不要把它和use效果一起使用。如果您想依赖于对象,请使用肯特的DeepCompare效应,但您不需要它。 setFetchedTypes(prevFetchedTypes => [...prevFetchedTypes, types])
您的use效应正在用上面的行更新pechedTypes,但它也意味着在pechedTypes更改时运行。因此,使用效果会更新它,因为它是一个已经更改的依赖项,所以使用效果会再次运行,导致无限循环。
一种可能的解决方案:如果要在加载组件时提取数据,请将useEffect更改为:
useEffect(() => {
axios.get('/types.json')
.then(response => {
let types = []
for(let key in response.data) {
types.push({...response.data[key], id: key})
}
console.log('types : ', types)
setFetchedTypes(types)
})
.catch(error => console.log(error))
console.log('fetchedtypes', fetchedTypes)
}, [])
但是由于您有一个点击处理程序,我假设您希望在POST请求之后更新数据。如果onClickHandler
返回新创建的类型,请执行以下操作:
const onClickHandler = () => {
const type = {type: inputValue}
axios.post('/types.json', type)
.then(response => {
const newType = response.data;
const updatedTypes = [...types, newType]
setFetchedTypes(updatedTypes)
})
.catch(error => console.log(error))
}
注意:我不知道你的类型的结构,所以我在假设中工作,但这就是我的想法
我有两个表,分别名为tblOefenen(带有主键)和tblOefenen2(带有外键)。我已经删除了前面的外键,因为我想添加‘更新级联’到外键。 那么做了什么:1。我已经移除了TbloeFenen2的约束(外键)。2.我已经将新的外键添加到列ID中,我的主键在列ID上,也在表tbloefenen中: 有人能帮我一下吗?
我试图在Java卡上列出小程序/包。我使用以下APDU命令获取列表: 该命令返回状态字,因此我为字节发送一个GET-RESPONSE命令: 这将为我提供数据字节和状态字(“更多可用数据”)。接下来我应该发送什么来接收状态字指示的进一步数据? APDU跟踪:
我通过使用map函数迭代来显示我的状态,这是一个数组。此外,我有一个按钮,在点击反转数组。 我认为我想做什么是相当明显的。但这对我不起作用,我不知道为什么。我必须单击两次来完成第一次还原,出现了奇怪的情况,即呈现的数组和Chrome中React开发工具在组件状态中显示的数组不匹配。 我无法解释这种行为。我开始认为这与我从道具中获得阵列有关,但我真的不知道。有什么想法吗?
今天我在家里的电脑上安装了netbean,以便在家做一些工作。我安装了java 8 JDK(151),并安装了包含所有内容的netbean(没有进行自定义安装)。然后我把我的项目从github上撤下来。 我的安装文件夹是在E:\netbean我的项目文件夹是默认的c: 我加载了项目,打开XAMPP并运行它。太好了,很管用。 然后我对HTML进行了更改(修复了我犯的一个拼写错误)。再次运行。找不到零
我在上,使用和。 我试图实现的是下载所有的罐子从nexus。什么,我已经完成了。成功安装 这是我的maven的内容 我父母pom的内容 在上面的中定义了两个项目。当我使用jenkins构建时,第一个项目成功构建。但是第二个抛出错误。 无法对项目2执行目标:无法解析项目com的依赖项。abc:project2:war:0.0.1-快照:找不到com。oracle:ojdbc5:jar:11.2.0.
我正在努力练习techniqual测试,我必须计算DNA序列中的字符数,但无论我做什么,计数器都不会更新,这真的很令人沮丧,因为我用ruby学习代码,它会更新,但Java似乎有一个问题。我知道我的语法有问题,但是我怎么也想不出来。 如果满足条件并重新分配值,它只会一直返回零,而不是加一。