Apolllo客户端状态预设缓存在服务器端渲染上不起作用

时间:2019-09-30 19:17:16

标签: next.js react-apollo apollo-client server-side-rendering react-ssr

我试图将带有钩子useQueryuseMutation的Apollo客户端状态数据用作NextJS应用程序中的全局存储。 当我遵循NextJS的名为with-apollohttps://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)。 当我记录加载/数据状态时,我在服务器上看到了这一点: SSR error 在客户端上,一切都很好: client

有人知道这是怎么回事吗?设置好缓存后,我就永远不会看到loading:true状态了吗? getDataFromTree中的@apollo/react-ssr不能正常工作吗?

0 个答案:

没有答案