为什么React Hooks Axios API调用返回两次?

时间:2019-05-29 19:41:17

标签: reactjs axios

为什么即使检查是否已加载,React Hooks Axios API调用也返回两次?

我已经习惯了this.setState,但是试图理解它为什么在控制台日志中两次出现的原因。

我的代码:

import React, { useState, useEffect } from "react";
import axios from "axios";

const App = () => {
  const [users, setUsers] = useState({ results: [] });
  const [isLoading, setIsLoading] = useState(false);

  useEffect(() => {
    const fetchData = async () => {
      setIsLoading(true);

      await axios
        .get("https://jsonplaceholder.typicode.com/users/")
        .then(result => setUsers(result));

      setIsLoading(false);
    };

    fetchData();
  }, []);

  console.log(
    users.status === 200 && users.data.map(name => console.log(name))
  );

  return <h2>App</h2>;
};

export default App;

3 个答案:

答案 0 :(得分:1)

这实际上是正常行为。这就是功能组件与useEffect()一起工作的方式。在类组件中,状态更改时,“ this”关键字会发生突变。在带有挂钩的功能组件中,该函数会再次被调用,并且每个函数都有其自己的状态。由于您两次更新了状态,因此该函数被两次调用。

您可以在React钩子的创建者之一的专栏中仔细阅读这2篇文章,以了解更多详细信息。

https://overreacted.io/a-complete-guide-to-useeffect/

https://overreacted.io/how-are-function-components-different-from-classes/

答案 1 :(得分:0)

两次大火,也许是一次来自componentDidMount,另一次是来自componentDidUpdate

https://reactjs.org/docs/hooks-effect.html

  

useEffect是否在每次渲染后运行?是!默认情况下,它在第一次渲染后和每次更新后都运行。 (我们将在后面讨论如何自定义此功能。)您可能会发现更容易想到效果发生在“渲染后”,而不是“安装”和“更新”。 React保证DOM在运行效果时已被更新。

在触发API调用之前,您没有选中“ isLoading”

    // Only load when is not loading
    if (!isLoading) {
        fetchData();
    }

答案 2 :(得分:0)

即使我有类似的问题。在我的情况下,useEffect()被调用两次是因为父组件由于数据更改而重新呈现。