Tho*_*sky 11 javascript caching apollo reactjs graphql
我有一个由 2 个组件组成的页面,每个组件都有自己的数据请求,例如
<MovieInfo movieId={queryParamsId}/>
const GET_MOVIE_INFO = `gql
query($id: String!){
movie(id: $id){
name
description
}
}`
Run Code Online (Sandbox Code Playgroud)
下一个组件
<MovieActors movieId={queryParamsId}/>
const GET_MOVIE_ACTORS = `gql
query($id: String!){
movie(id: $id){
actors
}
}`
Run Code Online (Sandbox Code Playgroud)
对于每个查询,我都使用 apollo hook
const { 数据,加载,错误 } = useQuery(GET_DATA, {variable: {id: queryParamsId}}))
一切都很好,但我收到一条警告消息:
替换查询对象的电影字段时,缓存数据可能会丢失。要解决这个问题(这不是 Apollo Client 中的错误),要么确保所有 Movie 类型的对象都有 ID,要么为 Query.movie 字段定义一个自定义合并函数,以便 InMemoryCache 可以安全地合并这些对象: { ... }
它在 google chrome 上工作正常,但此错误会影响 Safari 浏览器。一切都令人崩溃。我 100% 确定这是因为这条警告消息。在第一个请求中,我在缓存中设置了电影数据,在对同一查询的第二个请求中,我只是用新数据替换旧数据,因此以前的缓存数据是未定义的。我该如何解决这个问题?
Zee*_*yed 11
这是托马斯提到的相同解决方案,但更短一些
const cache = new InMemoryCache({
typePolicies: {
Query: {
fields: {
YOUR_FIELD: {
// shorthand
merge: true,
},
},
},
},
});
Run Code Online (Sandbox Code Playgroud)
这与下面的相同
const cache = new InMemoryCache({
typePolicies: {
Query: {
fields: {
YOUR_FIELD: {
merge(existing, incoming, { mergeObjects }) {
return mergeObjects(existing, incoming);
},
},
},
},
},
});
Run Code Online (Sandbox Code Playgroud)
解决了!
cache: new InMemoryCache({
typePolicies: {
Query: {
fields: {
YOUR_FIELD: {
merge(existing = [], incoming: any) {
return { ...existing, ...incoming };
// this part of code is depends what you actually need to do, in my
case i had to save my incoming data as single object in cache
}
}
}
}
}
})
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23023 次 |
| 最近记录: |