[英]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.