javascript - Apollo + React Router 4 SSR 问题

标签 javascript react-router apollo

不确定这是 React Router v4、React Apollo 客户端还是我的实现的问题。

但是用<ApolloProvider>作为顶级 HOC,即:

const ComponentsWithData = await getDataFromTree(
  <ApolloProvider client={apolloClient}>
    <StaticRouter location={ctx.request.url} context={route}>
      <App />
    </StaticRouter>,
  </ApolloProvider>,
);

const html = ReactDOMServer.renderToString(ComponentsWithData);

...我得到:

Warning: Failed prop type: Invalid prop children of type array supplied to ApolloProvider, expected a single ReactElement. in ApolloProvider Error React.Children.only expected to receive a single React element child.

然后翻转过来,使用 React Router 的 <StaticRouter>作为顶部,即:

const ComponentsWithData = await getDataFromTree(
  <ApolloProvider client={apolloClient}>
    <StaticRouter location={ctx.request.url} context={route}>
      <App />
    </StaticRouter>,
  </ApolloProvider>,
);

...然后我得到:

A <Router> may have only one child element

渲染在浏览器中工作正常(使用 React Router 的 <BrowserRouter> ),但在服务器上失败。

它在 React Router v3 中也能很好地工作,因为所有的路由匹配都在 React 层次结构的外部,而不是在它的内部。

最佳答案

这实际上是一个用户错误。我希望 getDataFromTree() 返回一个解析为原始组件链的 Promise(使用正确注入(inject)的 GraphQL 数据 Prop ),但实际上它只是等待数据准备就绪。

正确的格式是:

const Components = (
  <StaticRouter location={ctx.request.url} context={route}>
    <ApolloProvider client={client}>
      <App />
    </ApolloProvider>
  </StaticRouter>
);

await getDataFromTree(Components);
const html = ReactDOMServer.renderToString(Components);

关于javascript - Apollo + React Router 4 SSR 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43075002/

相关文章:

javascript - vimeo 视频完成后如何制作 div 节目?

javascript - 一个文件中的两个js文件

javascript - 错误 : StaticInjectorError(AppModule)[HomePage -> BluetoothSerial]

javascript - nextjs Router.back 进行全页面刷新

graphql - 不允许在 GraphQL Schema 中使用空字符串

graphql - 从缓存graphql apollo 2.0读取数据

android - .gradle/nodejs/node-v6.7.0-darwin-x64/bin/node'' 以非零退出值 1 完成

javascript - Vue.js-Vuex 更新数组内部状态中的对象未反射(reflect)在组件 DOM 中

javascript - 在 React 中提交后重定向

javascript - 使用 browserhistory 更改 url 的 react 路线但没有任何反应