我使用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上询问了此问题,但他们没有答案就将其关闭。
答案 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()}