我需要使用react-router从服务器端的另一个页面重定向页面。 我编写的代码在客户端工作,但不在服务器渲染中。 你可以在这里找到代码:
这是 /src/shared/components/LoginPage.js 中的重定向代码:
componentWillMount() {
...
this.props.history.replaceState(null, '/home');
}
注意:
我做了:
function requireAuth(nextState, replaceState) {
// replaceState({ nextPathname: nextState.location.pathname }, '/login');
}
...
<Route path="home" component={HomePage} onEnter={requireAuth} />
此代码正常运行,但我想在组件
中进行重定向答案 0 :(得分:2)
React Router没有内置容量来处理服务器端组件内的重定向。
这是因为onEnter
挂钩在match
的上下文中运行,因此React Router可以接听replaceState
个调用并通知所请求转换的match
回调。在componentWillMount
运行时,match
已经调用了回调。
在服务器上呈现时,您最有可能需要构建一些更高级别的抽象来管理history.replaceState
调用,然后在ReactDOM.renderToString
返回后执行相应的操作。
答案 1 :(得分:1)
处理此问题的几种不同方法:
1 - 如果您可以在客户端实际发生重定向,则可以执行类似
的操作history.push('/newPath/');
这是我使用的解决方案,以便不会有两种不同的重定向(在客户端和服务器上)。在我的情况下,我传入了一个“上下文”道具(仅用于代码的服务器端部分,所以我的方法看起来更像
componentWillMount() {
if (this.props.context) { // context only available on server side
this.props.context.doLogout();
}
this.props.history.push('/newPath/');
}
2 - 如果您真的希望服务器进行重定向,那么您必须从快速或您正在使用的任何框架传递响应对象:
componentWillMount() {
// you may have to this.props.history.push('/currentPath');
this.props.res.redirect(302, '/newPath/');
}
如果有必要,请尽快详细说明 - 我花了一些时间来讨论这个并选择了前一个解决方案(代码简单而非正确,但无论对你有用)。