无限循环useEffect()挂钩

时间:2020-04-23 09:42:49

标签: javascript reactjs web react-hooks

所以,我正在使用hook useState():

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

然后使用useEffect()挂钩从API获取数据:

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

    console.log(dailyData)

    fetchAPI();
});

但是问题是这些请求是无止境的。

我是React的新手,所以如果您解释为什么会这样,那将是很棒的事情。

4 个答案:

答案 0 :(得分:2)

任何状态数据更新时,都会触发useEffect

因此,如果您在dailyData内部更新useEffect,状态更改将再次触发useEffect

您可以将依赖项数组添加到useEffect或任何flag变量以执行适当的操作。

例如,添加一个空的依赖项数组将像componentDidMount一样工作。

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

答案 1 :(得分:0)

您的useEffect需要数组依赖项 例如。

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

 console.log(dailyData)

 fetchAPI();
}, []);

答案 2 :(得分:0)

要使useEffect仅运行一次,您必须在useEffect函数中提供一个空数组

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

    console.log(dailyData)

    fetchAPI();
},[]);

如果要在发生某些更改时运行useEffect,则可以在数组中指定值,并且只要变量有任何更改,useEffect都会再次运行。

答案 3 :(得分:0)

每次更改组件中变量的状态时,useEffect()挂钩将运行。 因此,为避免无限循环,您需要将依赖项数组嵌套在useEffect()挂钩中。

您的代码可以修改为

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

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

        console.log(dailyData)

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

可以定义依赖项数组,因为它是useEffect函数中的第二个可选参数。 顾名思义,它是一个依赖项数组,当从上一个渲染更改时,它将调用在第一个参数中定义的效果函数。