【问题标题】:Tell apollo-client what gets returned from X query with Y argiments?用 Y 参数告诉 apollo-client 从 X 查询返回什么?
【发布时间】:2019-11-06 20:42:53
【问题描述】:

我有一个Items 的列表,不管是什么类型。我可以使用query itemsquery item(id) 查询所有这些。

我意识到阿波罗不知道会返回什么。它知道类型,但不知道确切的数据。也许有办法不提出额外的要求?将一个查询映射到另一个查询?

伪代码:

// somewhere in Menu.tsx (renders first)
let items = useQuery(GET_ITEMS);
return items.map(item => <MenuItemRepresenation item={item} />);

// meanwhile in apollo cache (de-normalized for readability):
{ ROOT_QUERY: {
    items: [  // query name per schema
      { id: 1, data: {...}, __typename: "Item" },
      { id: 2, data: {...}, __typename: "Item" },
      { id: 3, data: {...}, __typename: "Item" },
    ]
  }
} 

// somewhere in MainView.tsx (renders afterwards)
let neededId = getNeededId();  // 2
let item = useQuery(GET_ITEM, { variables: { id: neededId } } );
return <MainViewRepresentation item={item} />;

这样的代码将执行两次提取。即使数据已经在缓存中。但似乎阿波罗在查询级别上思考。我想向它解释一下:“如果我进行item 查询,您需要查看您之前所做的items 查询。如果它没有具有该ID 的项目,请继续进行请求。”

可以通过在MainView.tsx 中查询items 并梳理结果来完成类似的操作。它可能适用于伪代码,但在真正的应用程序中并不是那么简单:缓存在某些情况下可能是空的。或不足以满足必填字段。这意味着当我们只需要一个项目时,我们必须加载所有项目。

经过进一步研究,Apollo Link 看起来很有希望。可能会拦截传出查询。明天再调查。

【问题讨论】:

  • 不太清楚你在这里问什么。 GraphQL 是一种强类型语言。 Apollo 客户端将根据服务器返回的__typename“知道”一个项目是什么。也许您可以编辑您的问题以更好地解释您的要求,最好包括一些代码或伪代码的 sn-ps 来说明您的观点。
  • @DanielRearden 嗨,按要求展开。

标签: reactjs graphql react-apollo apollo-client


【解决方案1】:

别介意阿波罗链接。我要找的东西叫做cacheRedirects。 这是ApolloClientCache 构造函数的一个选项。

cacheRedirects: {
  Query: {
    node: (_, args, { getCacheKey }) => {
      const cacheKey = getCacheKey({
        __typename: "Item",
        id: args.id,
      });

      return cacheKey;
    },
  },
},

我会链接到文档,但它永远不稳定。我已经看到太多来自此类问题的死链接了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-10
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2020-04-01
    • 2019-08-26
    相关资源
    最近更新 更多