如何在 SSR 中获取 react-router-redux redirect URL

How to get react-router-redux redirect URL in SSR

我正在使用 react-router-redux@5.0.0-alpha.9,但我还没有找到在服务器端渲染上捕获 <Redirect> URL 的解决方法。

用例:

现在重定向正在浏览器中进行,但最好能提供一种方法来捕获 <Redirect> URL 并从服务器发送正确的重定向。

我很想做类似于 <StaticRouter> 解决方案的事情(使用 context<ConnectedRouter>

import { ConnectedRouter } from 'react-router-redux';

const context = {};
const app = renderToString(
  <Provider store={store}>
    <ConnectedRouter history={history} isSSR context={context}>
      <Application />
    </ConnectedRouter>
  </Provider>
);

if (context.url) {
  const HTTP_FOUND = 302;

  res.writeHead(HTTP_FOUND, { Location: context.url });
  res.end();
}

我也试过 history.listen 但它没有触发位置更改。

import { ConnectedRouter } from 'react-router-redux';
import createHistory from 'history/createMemoryHistory';

const context = {};
const history = createHistory({
  initialEntries: [req.url], // req.url comes from express server
  initialIndex: 0,
});

history.listen(location => {
  // this gets never called
  console.log('History changed!', location);
});

const app = renderToString(
  <Provider store={store}>
    <ConnectedRouter history={history} isSSR>
      <Application />
    </ConnectedRouter>
  </Provider>
);

history.listen 未触发,因为 <Redirect> 组件在 SSR 期间在服务器上使用并与 ConnectedRouter 一起使用时不会执行任何操作,因为 ConnectedRouter 未提供所需的 staticContext.

请查看 https://github.com/ReactTraining/react-router/pull/5323 进行讨论。

似乎正确的解决方案是在 SSR 期间根本不使用 ConnectedRouter,而是使用 StaticRouter 并调度您自己的初始 LOCATION_CHANGE 操作以使商店同步与当前位置。

有关此内容的详细评论,请参阅 https://github.com/ReactTraining/react-router/issues/5333#issuecomment-315737132