Javascript Apollo GraphQL更新到类型策略
我的头撞在墙上。我已经更新到Apollo 3,无法理解如何将Javascript Apollo GraphQL更新到类型策略,javascript,typescript,graphql,apollo,typepolicies,Javascript,Typescript,Graphql,Apollo,Typepolicies,我的头撞在墙上。我已经更新到Apollo 3,无法理解如何将updateQuery迁移到typePolicy。我正在进行基本的基于延续的分页,这就是我用来合并fetchMore结果的方式: await fetchMore({ query: MessagesByThreadIDQuery, variables: { threadId: threadId, limit: Configuration.MessagePageSize, continuation: toke
updateQuery
迁移到typePolicy
。我正在进行基本的基于延续的分页,这就是我用来合并fetchMore
结果的方式:
await fetchMore({
query: MessagesByThreadIDQuery,
variables: {
threadId: threadId,
limit: Configuration.MessagePageSize,
continuation: token
},
updateQuery: (prev, curr) => {
// Extract our updated message page.
const last = prev.messagesByThreadId.messages ?? []
const next = curr.fetchMoreResult?.messagesByThreadId.messages ?? []
return {
messagesByThreadId: {
__typename: 'MessagesContinuation',
messages: [...last, ...next],
continuation: curr.fetchMoreResult?.messagesByThreadId.continuation
}
}
}
我曾尝试自己编写合并
类型策略
,但它只是不断加载阿波罗缓存中的重复标识符并抛出错误。以下是我的typePolicy
查询的外观
typePolicies: {
Query: {
fields: {
messagesByThreadId: {
keyArgs: false,
merge: (existing, incoming, args): IMessagesContinuation => {
const typedExisting: IMessagesContinuation | undefined = existing
const typedIncoming: IMessagesContinuation | undefined = incoming
const existingMessages = (typedExisting?.messages ?? [])
const incomingMessages = (typedIncoming?.messages ?? [])
const result = existing ? {
__typename: 'MessageContinuation',
messages: [...existingMessages, ...incomingMessages],
continuation: typedIncoming?.continuation
} : incoming
return result
}
}
}
}
}
所以我能够解决我的用例。这似乎比实际需要困难得多。我基本上必须尝试定位与传入项匹配的现有项并覆盖它们,以及添加缓存中尚不存在的任何新项 我还必须仅在提供了延续令牌的情况下应用此逻辑,因为如果它为null或未定义,我应该只使用传入值,因为这表明我们正在进行初始加载 我的文档形状如下:
{
“项”:[{id:string,…others}],
“continuation”:“一些令牌值”
}
我创建了一个通用类型策略,可以用于所有形状相似的文档。它允许我指定items属性的名称、要缓存的键参数以及graphql类型的名称
导出函数ContinuationPolicy(keyArgs:Array,itemPropertyKey:string,typeName:string){
返回{
keyArgs,
合并(现有:任意、传入:任意、参数:任意){
if(!!existing&&!!args.args?.continuation){
const existingItems=(现有?现有[itemPropertyKey]:[])
常量incomingItems=(传入?传入[itemPropertyKey]:[])
let items:Array=[…existingItems]
for(设i=0;i因此我能够解决我的用例。这似乎比实际需要困难得多。我基本上必须尝试定位与传入项匹配的现有项并覆盖它们,以及添加缓存中尚不存在的任何新项 我还必须仅在提供了延续令牌的情况下应用此逻辑,因为如果它为null或未定义,我应该只使用传入值,因为这表明我们正在进行初始加载 我的文档形状如下:
{
“项”:[{id:string,…others}],
“continuation”:“一些令牌值”
}
我创建了一个通用类型策略,可以用于所有形状相似的文档。它允许我指定items属性的名称、要缓存的键参数以及graphql类型的名称
导出函数ContinuationPolicy(keyArgs:Array,itemPropertyKey:string,typeName:string){
返回{
keyArgs,
合并(现有:任意、传入:任意、参数:任意){
if(!!existing&&!!args.args?.continuation){
const existingItems=(现有?现有[itemPropertyKey]:[])
常量incomingItems=(传入?传入[itemPropertyKey]:[])
let items:Array=[…existingItems]
for(设i=0;i