【问题标题】:React / Apollo: Displaying result of GraphQL query (useQuery hook)React / Apollo:显示 GraphQL 查询的结果(useQuery 挂钩)
【发布时间】:2020-12-14 05:58:39
【问题描述】:

我是 react/graphql/apollo 的新手,但是我遵循了有关如何在 www.apollographql.com 上使用 Apollo 进行 graphql 查询的指南。但是我似乎无法显示结果。

这是我执行查询的代码

import React from "react";
import { useQuery } from 'react-apollo';
import gql from "graphql-tag";

const GET_PRODUCTS = gql`
  query getProducts{
    products(first: 1) {
      edges {
        node {
          id
          name
        }
      }
    }
}
`;

const StartPage = () => {
  const { loading, error, returnData } = useQuery(GET_PRODUCTS, {
    variables: {},
  });
 
  return (
    <p>Hello world, this should be the data: {returnData}</p>
  );
};

我只看到“Hello world,这应该是数据:”但没有打印 returnData? 我不能只打印整个响应吗?

当我重新加载页面时,我可以在网络选项卡中清楚地看到我的查询 确实被执行了,我得到了正确的回应

请求

{"operationName":"getProducts","variables":{},"query":"query getProducts {\n  products(first: 1) {\n    edges {\n      node {\n        id\n        name\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n}\n"} 

回复

{"data":{"products":{"edges":[{"node":{"id":"UHJvZHVjdDo3Mg==","name":"Apple Juice","__typename":"Product"},"__typename":"ProductCountableEdge"}],"__typename":"ProductCountableConnection"}}}

那么有没有人知道为什么 returnData 没有打印/为空?

【问题讨论】:

  • 你不能从示例中复制/粘贴更多代码吗? ...if(loading)... 是出于某种原因 ...data 可以重命名,但其他方式...我想没有更早的反应加载数据体验

标签: reactjs graphql apollo react-apollo apollo-client


【解决方案1】:

应该是const { loading, error, data } = useQuery(GET_PRODUCTS, ...); 注意:data 而不是returnData

当你解构对象时,你需要在关键点上准确无误。如果您需要将数据保存在名为returnData 的变量中,您可以执行以下操作:

const { loading, error, data: returnData } = useQuery(GET_PRODUCTS, {
  variables: {},
});

还要注意,在 React 中,您不能只在花括号内渲染对象,React 需要一个字符串或一个数字。为了快速调试,您可以添加

return (
  <p>Hello world, this should be the data: {JSON.stringify(returnData)}</p
);

否则,您应该从返回对象的深处显示数据。

【讨论】:

  • 非常感谢您的成功!只有一个后续问题,如果我只想显示第一个产品的名称给定我提供的查询响应,这不是应该如何打印的:

    你好,这应该是数据 {JSON. stringify(data)},名称:{data.products.edges[0].node.name}

    但这不起作用?
  • 啊,没关系,我解决了后续问题。事实证明,一旦您确定数据已加载,您真的只需要打印 {data.products.edges[0].node.name},它一开始就不能包含这些对象
猜你喜欢
  • 2019-01-26
  • 2021-06-14
  • 2021-08-05
  • 2020-11-08
  • 2019-02-17
  • 2021-01-19
  • 2021-08-26
  • 2020-11-02
  • 2020-05-20
相关资源
最近更新 更多