【发布时间】:2020-11-17 06:29:14
【问题描述】:
我有一个由 2 个组件组成的页面,每个组件都有自己的数据请求 例如
<MovieInfo movieId={queryParamsId}/>
const GET_MOVIE_INFO = `gql
query($id: String!){
movie(id: $id){
name
description
}
}`
下一个组件
<MovieActors movieId={queryParamsId}/>
const GET_MOVIE_ACTORS = `gql
query($id: String!){
movie(id: $id){
actors
}
}`
对于每个查询,我都使用 apollo hook
const { 数据、加载、错误 } = useQuery(GET_DATA, {variable: {id: queryParamsId}}))
一切都很好,但我收到了一条警告消息:
替换 Query 对象的电影字段时,缓存数据可能会丢失。 为了解决这个问题(这不是 Apollo Client 中的错误),要么确保所有 Movie 类型的对象都有 ID,要么为 Query.movie 字段定义自定义合并函数,以便 InMemoryCache 可以安全地合并这些对象: { ... }
在 google chrome 上运行正常,但此错误会影响 Safari 浏览器。一切都令人崩溃。我 100% 确定这是因为这个警告信息。在第一个请求中,我在缓存中设置了电影数据,在对同一查询的第二个请求中,我只是将旧数据替换为新数据,因此之前的缓存数据是未定义的。我该如何解决这个问题?
【问题讨论】:
-
换句话说:“您的查询(请求)
movie[类型] 应该包含id属性”(在name、description或actors旁边) - 否则它不是cache'able - [你可以使用其他命名的唯一字段和转换函数] - 缓存就是这样工作的,它需要唯一的对象 -
“确保所有 Movie 类型的对象都有 ID”很清楚 imo
标签: javascript reactjs caching graphql apollo