使用React Router V4在ReactJS组件上重定向到服务器路由

时间:2018-03-22 00:33:03

标签: reactjs routes react-router-v4

我的React Router V4路由以这种方式构建:

const isAuthenticated = () => {
    let hasToken = localStorage.getItem("jwtToken");
    if (hasToken) return true;
    return false;
};

const AuthenticatedRoute = ({ component: Component, ...rest }) =>
    <Route
        {...rest}
        render={props =>
            isAuthenticated()
                ? <Component {...props} />
                : <I NEED TO REDIRECT FROM HERE TO SERVER PAGE />}
    />;

class App extends Component {
    render() {
        return (
            <BrowserRouter basename="/editor">
                <Switch>
                    <AuthenticatedRoute exact path="/" component={AppNav} />
                    <AuthenticatedRoute
                        exact
                        path="/:module"
                        component={AppNav}
                    />
                    <AuthenticatedRoute
                        exact
                        path="/:module/:screen"
                        component={AppNav}
                    />
                    <AuthenticatedRoute
                        exact
                        path="/:module/:screen/:action"
                        component={AppNav}
                    />
                    <AuthenticatedRoute
                        exact
                        path="/:module/:screen/:action/:id"
                        component={AppNav}
                    />

                    <Route component={PageNotFoundError} />
                </Switch>
            </BrowserRouter>
        );
    }
}

export default App;

正如您在代码中看到的那样,如果未经过身份验证,我想重定向到服务器页面。该页面是管理用户注册的另一个响应应用程序,位于服务器中但位于另一个路由树中:/registration

我尝试过但没有成功:

<Redirect to="//registration' />
windows.location = "/registration"
windows.location.href = "/registration"
<Redirect to="http//registration' />
windows.location = "http://registration"
windows.location.href = "http://registration"

所有重定向到当前应用程序中的页面。

对此有什么解决方法?

2 个答案:

答案 0 :(得分:1)

我是这样实现的:

const AuthenticatedRoute = ({ component: Component, ...rest }) =>
    (<Route
        {...rest}
        render={props =>(
            isAuthenticated()
                ? (<Component {...props} />)
                : ( window.location = "http://your_full_url" )
        )}
    />);

答案 1 :(得分:0)

我有一个带有react路由器的create-react-app项目,这个问题是,即使我已经配置了使用另一个react,当输入路径'/ path / *时,它也会像在同一个react路由器中那样加载快速服务器的项目。 问题在于服务工作者正在后台运行,并且对于“ /”内部的任何路由,它都在使用缓存。
对我来说,解决方案是修改“ registerServiceWorker.js”,以便在路径内时忽略服务工作者。我对服务人员的了解不是很深入,但这是我使用的代码:

export default function register() {
    ...
    window.addEventListener('load', () => {
        const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
        if(window.location.href.match(/*\/path\/*/)){
           // Reload the page and unregister if in path
           navigator.serviceWorker.ready.then(registration => {
              registration.unregister().then(() => {
                  window.location.reload();
              });
           });
        } else if (isLocalhost) {
    ...

在路径内时,它将退订服务工作者并重新加载页面。