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

为什么我的状态在获取数据后没有更新?

微生毅
2023-03-14

各位早上好,,

我刚完成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效果的方式或更新状态的方式的问题,或者两者兼而有之。

谢谢你的帮助

祝您今天过得愉快

共有1个答案

汝繁
2023-03-14

你得到一个无限循环的原因是因为你的使用效果和两个原因。

  • 我假设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似乎有一个问题。我知道我的语法有问题,但是我怎么也想不出来。 如果满足条件并重新分配值,它只会一直返回零,而不是加一。