【问题标题】:Apollo fails to merge cache on refetch callApollo 在 refetch 调用时无法合并缓存
【发布时间】:2022-07-13 17:46:09
【问题描述】:

我正在尝试对每次重新获取(过滤列表)使用合并功能,但现有值始终未定义。

返回和过滤列表的查询类型策略:

Query: {
        fields: {
            accounts: {
                keyArgs: false,
                merge(
                    existing,
                    incoming,
                    {args: {page = 1, pageSize = 20}, readField}
                ) {
                    const offset = (page - 1) * pageSize;
        
                    if (!existing?.items) {
                        return incoming;
                    }
        
                    const mergedItems = [...existing.items];
                    const existingIdSet = new Set(
                        mergedItems.map((item) =>
                            readField('externalReferenceCode', item)
                        )
                    );
        
                    const incomingItems = [...incoming.items].filter(
                        (item) =>
                            !existingIdSet.has(readField('externalReferenceCode', item))
                    );
        
                    for (let i = 0; i < incomingItems.length; ++i) {
                        mergedItems[offset + i] = incomingItems[i];
                    }
        
                    return {
                        ...existing,
                        items: mergedItems,
                    };
                },
                read(existing, {args: {page = 1, pageSize = 20}}) {
                    const offset = (page - 1) * pageSize;
        
                    if (!existing) {
                        return;
                    }
        
                    return {
                        ...existing,
                        items: existing.items?.slice(offset, offset + pageSize),
                    };
                },
            },
        },
    },

我做错了什么? 通过读取函数检查,值按预期传递,但调用重新获取时为空。

对于合并,首先是现有值。 在读取时,打印出来的值是现有值。

typePolicy.js:34 merge undefined {__typename: 'AccountPage', items: Array(20), totalCount: 235}
typePolicy.js:108 read {__typename: 'AccountPage', items: Array(20), totalCount: 235}
typePolicy.js:34 merge undefined {__typename: 'AccountPage', items: Array(2), totalCount: 2}
typePolicy.js:108 read {__typename: 'AccountPage', items: Array(2), totalCount: 2}

这是查询:

const GET_ACCOUNTS = gql`
    query getAccounts($filter: String, $pageSize: Int = 20, $page: Int = 1) {
        accounts(filter: $filter, pageSize: $pageSize, page: $page) {
            items {
                id
                externalReferenceCode
                name
            }
            totalCount
        }
    }
`;

【问题讨论】:

    标签: javascript reactjs apollo-client react-apollo


    【解决方案1】:

    有同样的问题。这是解决方案:https://community.apollographql.com/t/context-overwrite-is-being-set-to-true-meaning-that-the-existing-arg-in-the-merge-function-of-apollo-cache-is-always-undefined/3090/2

    对于任何重新获取操作,将 context.overwrite 切换为 true 的默认行为最近发生了合理的更改。对此的解决方案是一个看似未记录的选项,可以传递给 apollo 客户端实例化或 react 查询钩子的选项。选项是 refetchWritePolicy: "merge" (默认是 "overwrite")。

    【讨论】:

      猜你喜欢
      • 2020-11-17
      • 2022-01-13
      • 2023-04-06
      • 2023-03-13
      • 2020-12-10
      • 2021-05-09
      • 2018-07-04
      • 2020-02-27
      • 2018-10-02
      相关资源
      最近更新 更多