繁体   English   中英

如何将 Apollo 的 cacheRedirect 与嵌套查询一起使用

[英]How can I use Apollo's cacheRedirect with a nested query

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

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查询中传递的任何 arguments。 同样令人困惑的是,这个缓存重定向 function 被命中了它似乎不应该被命中的查询,比如:

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

那么发生了什么? 我只在我希望缓存重定向的地方使用readFragment ,但我希望该逻辑变得集中。

很难对这些问题做出肯定的判断,但我敢打赌,因为你说

同样令人困惑的是,这个缓存重定向 function 被命中似乎不应该被命中的查询

问题可能出在您的dataIdFromObject function 上。
这个 function 最终决定了是否从缓存中读取数据。 如果您有非常具体的理由,您应该只覆盖它。 例如:

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

如果这不能解决您的问题,我肯定会 go 进入 chrome 开发工具中的 Apollo 选项卡(您需要 Apollo 开发工具 chrome 扩展来执行此操作)并查看缓存部分。 它应该向您显示缓存中的数据以及存储数据的密钥。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM