我如何在嵌套查询中使用Apollo的cacheRedirect

问题描述 投票:0回答:1

我有一个看起来像这样的查询:

export const GET_PROJECT = gql`
  query GetProject($id: String!) {
    homework {
      getProject(id: $id) {
        ...ProjectFields
      }
    }
  }
  ${ProjectFieldsFragment}
`;

我的InMemoryCache看起来像这样:

const cache = new InMemoryCache({
  dataIdFromObject: ({ id }) => id,
  cacheRedirects: {
    Query: {
      getProject: (_, args, obj) => {
        console.log('Hello world');
      },
    },
  }
});

以上缓存重定向从未被点击。但是,如果我将其修改为:

const cache = new InMemoryCache({
  dataIdFromObject: ({ id }) => id,
  cacheRedirects: {
    Query: {
      homework: (_, args, obj) => {
        console.log('Hello world');
      },
    },
  }
});

它的确命中,但是我没有嵌套getProject查询中传递的任何参数。还令人困惑的是,此高速缓存重定向功能是针对似乎不应受到打击的查询命中的,例如:

export const SESSION = gql`
  query Session {
    session {
      user {
        id
        fullName
        email
      }
      organizations {
        name
        id
      }
    }
  }
`;

那么怎么回事?我只想在缓存要重定向的地方使用readFragment,但我希望该逻辑变得集中。

caching react-apollo
1个回答
0
投票

很难确定这类问题,但我敢打赌,因为你说过

还有一个令人困惑的地方是,该高速缓存重定向功能对于似乎不应受到打击的查询被命中

问题可能出在您的dataIdFromObject函数上。该功能最终决定是否从缓存中读取数据。仅当您有特定原因时才应覆盖此设置。例如:

import { InMemoryCache, defaultDataIdFromObject } from 'apollo-cache-inmemory';

// ...

export default new ApolloClient({
    link,
    cache: new InMemoryCache({
        dataIdFromObject(object) {
            switch (object.__typename) {
                case 'ModifierScale':
                case 'ModifierGroup':
                    return [
                        object.__typename,
                        object.id,
                        ...object.defaults
                            .map((defaultModifier) => defaultModifier.id)
                            .join(''),
                    ].join('');
                default:
                    return defaultDataIdFromObject(object); // fall back to default handling
            }
        },
    }),
});

此设置的要点是允许您自定义在加载数据时放入缓存的key

如果这不能解决您的问题,我肯定会进入chrome开发工具中的Apollo标签(您需要使用Apollo开发工具chrome扩展程序来执行此操作),然后查看“缓存”部分。它应该向您显示缓存中的数据以及存储数据的密钥。

© www.soinside.com 2019 - 2024. All rights reserved.