javascript - 在 React 组件中等待异步函数并显示 Spinner

标签 javascript reactjs asynchronous async-await react-apollo

这里是初学者。

尝试从服务器获取一些数据,并在获取后将其显示在我的 react 组件中。 但是,我在将异步函数集成到我的 react 组件中时遇到了麻烦。

import React, { useState } from "react";
import { request } from "graphql-request";

async function fetchData() {
  const endpoint = "https://localhost:3090/graphql"

  const query = `
    query getItems($id: ID) {
      item(id: $id) {
        title
      }
    }
  `;

  const variables = {
    id: "123123123"
  };

  const data = await request(endpoint, query, variables);
  // console.log(JSON.stringify(data, undefined, 2));

  return data;
}

const TestingGraphQL = () => {
  const data = fetchData().catch((error) => console.error(error));

  return (
    <div>
      {data.item.title}
    </div>
  );
};

export default TestingGraphQL;

我想在等待时简单地显示一个旋转器或其他东西,但我尝试了这个,似乎因为返回了一个 promise ,所以我无法做到这一点。

最佳答案

这里您需要使用 useEffect Hook 来调用 API。 从 API 返回的数据,我在这里存储为一个状态,以及一个加载状态来指示何时进行调用。

按照下面代码之间添加的注释进行操作 -

代码

import React, { useState, useEffect } from "react"; // importing useEffect here
import Layout from "@layouts/default";
import ContentContainer from "@components/ContentContainer";
import { request } from "graphql-request";

async function fetchData() {
   const endpoint = "https://localhost:3090/graphql"

   const query = `
     query getItems($id: ID) {
       item(id: $id) {
         title
       }
     }
   `;

   const variables = {
      id: "123123123"
   };

   const data = await request(endpoint, query, variables);
   // console.log(JSON.stringify(data, undefined, 2));

   return data;
}

const TestingGraphQL = () => {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  
  // useEffect with an empty dependency array works the same way as componentDidMount
  useEffect(async () => {
     try {
       // set loading to true before calling API
       setLoading(true);
       const data = await fetchData();
       setData(data);
       // switch loading to false after fetch is complete
       setLoading(false);
     } catch (error) {
       // add error handling here
       setLoading(false);
       console.log(error);
     }
  }, []);

  // return a Spinner when loading is true
  if(loading) return (
    <span>Loading</span>
  );

  // data will be null when fetch call fails
  if (!data) return (
    <span>Data not available</span>
  );

  // when data is available, title is shown
  return (
    <Layout>
      {data.item.title}
    </Layout>
  );
};

关于javascript - 在 React 组件中等待异步函数并显示 Spinner,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63192407/

相关文章:

javascript - 在 div 内的页面加载时显示微调图像,并在页面完全加载到 div 内时隐藏微调图像

javascript - React 的 setState() 是否保证每次都创建一个新的状态对象?

javascript - 如何知道何时导入包或将其粘贴到 index.html

java - 维护线程安全,同时防止可能发生同步回调的死锁

java - 单线程异步处理

javascript - 如何使用 javascript 找到某一天属于星期几?

javascript - Div从左上角滑动到右上角的动画

javascript - 更改的多个单选按钮提交 onclick location.href...可能的语法错误

node.js - 在 Ubuntu 中安装 npm 包时出错

ios - 从 Swift 函数中的异步调用返回数据