簡體   English   中英

Apollo + React Router 4 SSR問題

[英]Apollo + React Router 4 SSR issue

不知道這是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);

...我得到:

警告:prop類型失敗:提供給ApolloProvider array類型的prop children無效,應該是單個ReactElement。 在ApolloProvider錯誤中,React.Children.only只希望接收一個React元素的孩子。

然后翻轉一下,以React Router的<StaticRouter>作為頂部,即:

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

...然后我得到:

<Router>可能只有一個子元素

渲染在瀏覽器中工作正常(使用React Router的<BrowserRouter> ),但是在服務器上失敗。

由於在React層次結構之外而不是在其內部以聲明方式進行所有路由匹配,因此它在React Router v3中也能很好地工作。

這實際上是一個用戶錯誤。 我期望getDataFromTree()返回一個已解決到原始組件鏈的Promise(帶有正確注入的GraphQL數據道具),但實際上它只是在等待數據准備就緒。

正確的格式是:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM