![](/img/trans.png)
[英]Query data with partial string match using GraphQL + Apollo client in Javascript
[英]GraphQL/Apollo Client: get data from cache if a query is a subset of a previous query
我是 GraphQL 的新手,我認為它會自動執行此操作。
例如,如果我獲取帖子列表,然后打開單個帖子,則該帖子的數據已經在 memory 中。 我希望 GraphQL 能夠重新使用緩存中的數據,但它會發出另一個網絡請求。
架構類似於:
type Query {
posts: [Post]
post(id: ID): Post
}
我正在使用反應。 在PostsRoute
中,我有:
useQuery(gql`
query {
posts {
id
title
}
}
`);
在PostRoute
,我有:
useQuery(gql`
query {
post(id: ${postId}) {
id
title
}
}
`);
我需要為 Apollo 配置什么來自動使用緩存的數據嗎? 或者這是 Apollo 默認不支持的東西?
阿波羅 2 號
如果您使用的是 Apollo 2,那么您正在尋找的可能是cacheRedirects 。 它用於攔截查詢並使用緩存解決它。 鏈接的文檔實際上准確地解釋了您的用例,因此我建議您查看它,但為了后代,這是我個人的做法(適應您的情況)。
在實例化它時,在InMemoryCache
選項中,添加一個cacheRedirects
字段並為您的post
查詢指定一個自定義解析器,如下所示:
const cache = new InMemoryCache({
cacheRedirects: {
Query: {
post: (_, {id}, {getCacheKey}) => getCacheKey({__typename: "Post", id}),
},
},
});
這假設您的帖子的__typename
是Post
。 自定義解析器的第一個參數是ROOT_QUERY
的結果,我們在這里不使用它。 第二個參數是傳遞給查詢的 arguments (此處為{id: "some_id"}
),第三個參數是上下文,包含client
、 cache
和getCacheKey
。 這里只有getCacheKey
對我們有用。 該方法采用__typename
和id
,並在緩存中返回其鍵。
這樣就完成了自定義解析器。 現在,當您查詢post(id: some_id)
時,它將查看自定義解析器,接收緩存鍵並從緩存中返回與該鍵匹配的結果。
阿波羅 3 號
cacheRedirects
在 Apollo 3 中已被移除,但同樣的功能可以通過field policies來實現。 實例化InMemoryCache
時仍然需要進行設置,但略有不同:
const cache = new InMemoryCache({
typePolicies: {
Query: {
fields: {
post: (_, {args, toReference}) => toReference({__typename: "Post", id: args.id}),
},
},
},
});
我們在Query
類型的字段post
上定義了一個字段策略。 請注意,第二個參數現在包括args
和輔助實用程序。 這包括toReference
,這基本上是新的getCacheKey
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.