简体   繁体   English

无限循环 useEffect() 钩子

[英]Infinite loop useEffect() hook

So, I am using hook useState():所以,我正在使用钩子 useState():

const [dailyData, setDailyData] = useState({});

And useEffect() hook to fetch data from API:并使用 useEffect() 钩子从 API 中获取数据:

 useEffect(() => {
    const fetchAPI = async () => {
        setDailyData(await fetchDailyData())
    }

    console.log(dailyData)

    fetchAPI();
});

But the problem is that these requests are endless.但问题是这些请求是无止境的。

I'm new in React, so it would be great if you'd explain why this is caused.我是 React 的新手,所以如果你能解释一下为什么会这样,那就太好了。

Your useEffect is triggered when any state data is updated.当任何 state 数据更新时,将触发您的useEffect

So if you update dailyData inside your useEffect , the state change will trigger useEffect again.因此,如果您在useEffect中更新dailyData ,则 state 更改将再次触发useEffect

You can add a dependency array to useEffect or any flag variable for proper actions.您可以将依赖数组添加到 useEffect 或任何标志变量以进行适当的操作。

For example, adding an empty dependency array will work like componentDidMount .例如,添加一个空的依赖数组将像componentDidMount一样工作。

useEffect(() => {
    // Do something here
}, []);

Your useEffect needs an array dependency ex.您的 useEffect 需要一个数组依赖关系。

useEffect(() => {
 const fetchAPI = async () => {
    setDailyData(await fetchDailyData())
 }

 console.log(dailyData)

 fetchAPI();
}, []);

To make useEffect to run only one time you have to give an empty array in useEffect function要使 useEffect 只运行一次,您必须在 useEffect function 中提供一个空数组

useEffect(() => {
    const fetchAPI = async () => {
        setDailyData(await fetchDailyData())
    }

    console.log(dailyData)

    fetchAPI();
},[]);

If you want to run useEffect when some change occur you can specify the value in the array and whenever there will be any change in the variable the useEffect will run again.如果您想在发生某些更改时运行 useEffect,您可以在数组中指定值,并且每当变量发生任何更改时,useEffect 都会再次运行。

Each time state of variable in component is changed useEffect() hook will run.每次更改组件中变量的 state 时,useEffect() 挂钩都会运行。 So to avoid infinite loop you need to nest dependency array in useEffect() hook.所以为了避免无限循环,你需要在 useEffect() 钩子中嵌套依赖数组。

Your code can be modified as您的代码可以修改为

 const [dailyData, setDailyData] = useState({});

     useEffect(() => {
     const fetchAPI = async () => {
        setDailyData(await fetchDailyData())
      }

        console.log(dailyData)

     fetchAPI();
   },  [ //dependency array]);
 

Dependency array can be defined as it is the second optional argument in the useEffect function.可以定义依赖数组,因为它是 useEffect function 中的第二个可选参数。 As the name implies, it is an array of dependencies that, when changed from the previous render, will recall the effect function defined in the first argument.顾名思义,它是一个依赖数组,当从先前的渲染更改时,将调用第一个参数中定义的效果 function。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM