标签: apollo-cache-inmemory

Apollo Client v3 在给定时间段后删除缓存条目

我想知道是否有办法使缓存的项目在一定时间段(例如 24 小时)后过期。

我知道 Apollo Client v3 提供了诸如cache.evict和之类的方法cache.gc,这是一个很好的开始,我已经在使用;但是,我想要一种在给定时间段后删除缓存项目的方法。

我现在要做的就是向 Apollo 模式中的每个对象添加一个 TimeToLive 字段,当后端返回一个对象时,该字段将填充当前时间 + 24 小时(即 24 小时内的时间)。然后,当我在前端查询数据时,我检查返回数据的 TimeToLive 字段是否是将来的(如果不是,则意味着数据肯定是从缓存中检索的,在这种情况下我调用该函数refetch,这强制查询从服务器获取数据。但是,这似乎不是最好的方法,主要是因为我必须迭代返回数据中的每个结果并检查返回的对象是否已过期;如果是这样,所有内容都会重新获取。

我想到的另一个解决方案是使用React Native Queue之类的东西,并有一个后台任务来定期检查缓存和删除已过期的项目。但同样,我并不完全相信这个解决方案。

这里有一点背景信息:我正在构建一个烹饪/食谱应用程序 - 食谱/帖子缓存在设备上;然而,我担心的是,用户可以删除帖子,但缓存该帖子的其他人仍然可以看到它,因此,通过使缓存的项目过期,至少他们只能看到几个小时在其被移除之前。然而,它们可能是一个更好的方法来完成这一切,即让服务器与缓存的项目联系客户端(尽管在撰写本文时我无法想到任何低升力解决方案)

caching react-apollo apollo-client apollo-cache-inmemory

9
推荐指数
1
解决办法
3593
查看次数

Apollo Graphql relayStylePagination 防止查询在变量更改时重新获取

当我在 Apollo 客户端缓存类型策略中使用relayStylePagination辅助函数时,更改传递给查询的变量不会再次调用查询,即使我refetch手动调用该函数也是如此。它完美地执行了该fetchMore行为并合并了新数据。

我的缓存字段如下所示:

cache: new InMemoryCache({
      typePolicies: {
        Query: {
          fields: {
            inventories: relayStylePagination(),
          },
        },
      },
    })
Run Code Online (Sandbox Code Playgroud)

apollo reactjs apollo-client apollo-cache-inmemory

5
推荐指数
1
解决办法
797
查看次数

为什么我们需要“cacheRedirects”?

我阅读了有关与缓存数据交互的文档,虽然我了解如何cacheRedirects工作,但我有点困惑为什么首先需要它。这就是我问另一个问题的部分原因:Apollo 客户端是否缓存 React 中的嵌套对象

我们知道数据很可能已经在客户端缓存中,但由于它是通过不同的查询请求的,Apollo 客户端并不知道这一点。

这是为什么?

为了清楚起见,复制粘贴文档中的示例:

query ListView {
  books {
    id
    title
    abstract
  }
}

query DetailView {
  book(id: $id) {
    id
    title
    abstract
  }
}
Run Code Online (Sandbox Code Playgroud)

apollo graphql apollo-client apollo-cache-inmemory

2
推荐指数
1
解决办法
291
查看次数