在另一个查询中重用从一个查询缓存的数据

Posted

技术标签:

【中文标题】在另一个查询中重用从一个查询缓存的数据【英文标题】:Reusing data cached from one query in another 【发布时间】:2019-07-26 05:25:27 【问题描述】:

给定一个简单的 graphql 模式,如下所示:

type Contact 
    id: ID!
    name: String


type Query 
    RecentContacts: [Contact]
    Contact(id: ID!): Contact

如果我查询最近的联系人:

const GET_RECENT_CONTACTS = gql`
    query RecentContacts 
        RecentContacts 
          id
          name
        
    `

<Query client=client query=GET_RECENT_CONTACTS>
    (loading, error, data) =>  /* etc... */ 
</Query>

并接收数据,例如id 为 1 和 2 的联系人,缓存如下:

ROOT_QUERY
    RecentContacts: [Contact]
        0:  Contact:1
              id: 1
              name: Jack
        1:  Contact:2
              id: 2
              name: Jill

有没有办法让 Apollo 知道它可以将已缓存的条目用于查询 Contact(id: 1)Contact(id: 2),而无需发出另一个网络请求来恢复缓存中已经存在的数据?

具体来说,我希望这个查询在查询RecentContacts 之后不必发出网络请求,因为它需要的数据已经在缓存中(尽管从调用不同的查询返回):

const GET_CONTACT = gql`
    query Contact($id: ID!)
        Contact(id: $id)
          id
          name
        
    

<Query client=client query=GET_CONTACT variables=id: 1>
    (loading, error, data) => /* etc... */
</Query>

【问题讨论】:

【参考方案1】:

您可以使用cache redirects 来做到这一点。这是修改后的文档中的示例以使用您的架构:

import  InMemoryCache  from 'apollo-cache-inmemory';

const cache = new InMemoryCache(
  cacheRedirects: 
    Query: 
      User: (_, args,  getCacheKey ) =>
        getCacheKey( __typename: 'User', id: args.id )
    ,
  ,
);

【讨论】:

以上是关于在另一个查询中重用从一个查询缓存的数据的主要内容,如果未能解决你的问题,请参考以下文章

带有 React 的 ApolloClient V3:缓存和重用 fetchMore 查询的结果

MSSQL 查询执行计划缓存和 JDBC

在另一个查询中重用 GraphQL 查询而不重复

mysql做查询时,第一次很慢,第二三次就会很快?

Informix SQL / 在另一个查询中重用存储过程的结果

Apollo 从缓存中查询对象值