当前位置: 首页 > 面试题库 >

使用React Hooks多次获取数据axios

冷涵忍
2023-03-14
问题内容

我想从Github用户和他的仓库中获取全局信息(并获得固定的仓库会很棒)。我尝试通过异步等待来实现,但这是正确的吗?我有4次reRender(4次控制台日志)。提取所有数据后是否可以等待所有组件重新渲染?

function App() {
  const [data, setData] = useState(null);
  const [repos, setRepos] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      const respGlobal = await axios(`https://api.github.com/users/${username}`);
      const respRepos = await axios(`https://api.github.com/users/${username}/repos`);

      setData(respGlobal.data);
      setRepos(respRepos.data);
    };

    fetchData()

  }, []);

  if (data) {
    console.log(data, repos);
  }

  return (<h1>Hello</h1>)
}

问题答案:

批处理多个状态更新,但前提是状态更新是在事件处理程序中同步发生的,而不是setTimeoutsor async-await wrapped methods

此行为类似于类,因为在您的情况下,由于发生了两个状态更新调用,因此它执行两个状态更新周期

因此,最初您有一个初始渲染,然后有两个状态更新,这就是组件渲染三次的原因。

由于您的案例中的两个状态是相关的,因此您可以创建一个对象并一起更新它们

function App() {
  const [resp, setGitData] = useState({ data: null, repos: null });

  useEffect(() => {
    const fetchData = async () => {
      const respGlobal = await axios(
        `https://api.github.com/users/${username}`
      );
      const respRepos = await axios(
        `https://api.github.com/users/${username}/repos`
      );

      setGitData({ data: respGlobal.data, repos: respGlobal.data });
    };

    fetchData();
  }, []);

  console.log('render');
  if (resp.data) {
    console.log("d", resp.data, resp.repos);
  }

  return <h1>Hello</h1>;
}

工作演示



 类似资料:
  • 我正在通过Vuex商店中的axios从外部API获取数据,它为我提供了一个包含对象的数组——比方说——。 每个都有一个,我需要用它获取城市详细信息。我想将这个details对象作为一个新键添加到数组中。 现在我正在获取所有城市,并使用另一个Vuex操作获取城市详细信息。 所有城市的行动 获取所有城市后的变异 数组中的每个对象都有一个,我正在用它获取这个城市的详细信息。 我试图在动作中循环数组,以获

  • 我有一个使用Spring3.1的web应用程序。1.我们有一个使用JdbcTemplate的genericDao。数据源在GenericDaoImpl中是这样注入的。 这是一把简单的刀。 目前,凭借独特的数据源,它工作得非常完美。applicationContext配置了注释。 现在我必须集成一个新的DAO,仍然使用通用道,但在另一个数据库上工作(所以是另一个数据源)。 我在服务中使用@Trans

  • 问题内容: 我正在尝试使用$ resource从静态json文件中获取数据,这是代码段: 在控制器中 但是现在,我遇到了一个错误: 你能帮我解决我的问题吗? 问题答案: 您不需要为默认方法指定动作参数(这些方法是“ get”,“ save”,“ query”,“ remove”,“ delete”)。在这种情况下,您可以按原样使用method(这仅需要更改服务定义): PS还有一个提示是,如果您需

  • 给定web服务器上图像的路径: 如果我添加了: 我如何获取数据?

  • 问题内容: 我有一个包含以下内容的实体: 如您所见,有两个集合需要急切加载。这不起作用,并且hibernate会引发异常: 这是因为Hibernate无法一次性获取多个集合。但是,如果我将to 和to 更改为这部分效果很好,但另一个问题发生了。 当我尝试使用以下方法从数据库中获取实体时: 它失败并显示: 我确定传递给方法的ID 不为null,我已经调试了,并且对此有把握。它以某种方式消失在hibe

  • 我是新来的和学习它我想从Imdb站点/特定的电影链接提取评级,并发现我将能够从div与class=,因此我写了以下内容代码: 很奇怪,我没有得到任何数据,因为我能够在几周前得到评级数据。是div与class=存在于页面/url上。