我有一个看起来像这样的查询:
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
,但我希望该逻辑变得集中。
很难确定这类问题,但我敢打赌,因为你说过
还有一个令人困惑的地方是,该高速缓存重定向功能对于似乎不应受到打击的查询被命中
问题可能出在您的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扩展程序来执行此操作),然后查看“缓存”部分。它应该向您显示缓存中的数据以及存储数据的密钥。