我试图将带有钩子useQuery
和useMutation
的Apollo客户端状态数据用作NextJS应用程序中的全局存储。
当我遵循NextJS的名为with-apollo
(https://github.com/zeit/next.js/tree/canary/examples/with-apollo)的示例时,该示例使用HOC,在该HOC中,它将运行所有查询并首先在服务器上呈现该应用程序。
通常,您希望在这样的组件中捕获“加载”状态:
const { loading, data } = useQuery(GET_NAME_QUERY) // some @client query
if (loading) return <p>Loading...</p>
return <h1>Hello {data.name</h1>
但是我想跳过加载检查,并且始终具有默认状态。我认为可以通过将apollo客户端的缓存设置为一组默认值来实现,例如:
const cache = new InMemoryCache().restore(initialState);
// This is the part where the initial client-state data is set:
cache.writeData({
data: { name: 'Harry' }
});
const apolloClient = new ApolloClient({
cache, // <-- cache with preset client-state data
typeDefs,
resolvers,
})
我们的目标是做到这一点:
const { data } = useQuery(GET_NAME_QUERY) // some @client query, resolves immediately from cache
return <h1>Hello {data.name</h1>
我用一个机器人及其名称和状态创建了一个回购协议,这种方式从一开始就被缓存了。参见https://github.com/rnacken/next-with-apollo-client-state-cache
客户端正常工作,没有任何错误,但是在SSR期间,我遇到一个错误,因为在useQuery
调用之后它还没有数据(并且“ loading”为true)。
当我记录加载/数据状态时,我在服务器上看到了这一点:
在客户端上,一切都很好:
有人知道这是怎么回事吗?设置好缓存后,我就永远不会看到loading:true状态了吗? getDataFromTree
中的@apollo/react-ssr
不能正常工作吗?