如何将缓存还原到其初始状态

时间:2018-08-08 01:41:42

标签: reactjs graphql apollo react-apollo apollo-client

我使用SSR从服务器恢复初始状态的缓存

const cache = new InMemoryCache().restore(window.__APOLLO_STATE__)

以后很少有突变,我需要将缓存硬重置为初始状态。我天真地尝试将初始存储保持在组件状态,并将其传递给client.restore

componentDidMount () {
  this.setState({
    initState: this.props.client.extract()
  })
}

// When I need to reset, I'd call this method...
handleCacheReset () {
  this.props.client.restore( this.state.initState )
}

但是没有用。由于我也使用apollo-link-state,因此我想如果将缓存数据保留为默认值,也许可以在调用client.resetStore时写出它们

const cache = new InMemoryCache().restore(window.__APOLLO_STATE__)
const link = withClientState({ cache })
const client = new ApolloClient({
  link, cache,
  defaults: cache.data.data
})
client.onResetStore(link.writeDefaults)

// ...when it's time to reset the store
client.resetStore()

但是我只遇到Missing field ... in {}错误,并且没有数据写入存储。更糟糕的是,由于只有首字母client.writeData,因此我无法使用window.__APOLLO_STATE__。如果我只能读取整个缓存数据,则可能是合理的,但似乎没有readData方法。

是否可以通过编程方式将缓存恢复到其原始状态?

到目前为止,我看到的唯一解决方法是重新创建整个ApolloClient并强制重新渲染树,这既昂贵又效率低下。有想法吗?

P.S。在GitHub上询问了此问题,但他们没有答案就将其关闭。

2 个答案:

答案 0 :(得分:0)

这是网页版还是移动版?我自己还无法解决问题,但是在考虑apollo-cache-persist时,理论上您可以将缓存状态保存到本地存储中,并在以后将它们恢复到缓存中。

答案 1 :(得分:0)

this.props.client.extract()直接返回缓存对象而不是副本: https://github.com/apollographql/apollo-client/blob/master/packages/apollo-cache-inmemory/src/depTrackingCache.ts#L23

如果要保持原始状态,可以执行以下操作:

initState: {...this.props.client.extract()}