根据React中的状态重定向用户

时间:2016-03-29 00:48:18

标签: javascript reactjs react-router

现在,我的路由器看起来像这样:

<Router history={browserHistory}>
    <Route component={Provider}>
        <Route path="/" component={AppPage}>
            <Route path="login" component={LoginPage}/>
            <Route component={LoggedinPage}>
                <Route path="onboarding" component={OnboardingPage}/>
                <Route component={OnboardedPage}>
                    <IndexRoute component={HomePage}/>
                    <Route path="settings" component={SettingsPage}/>
                </Route>
            </Route>
        </Route>
    </Route>
</Router>
如果用户未登录,则

LoggedinPage重定向至/login,如果用户尚未完成新手入住流程,OnboardedPage会重定向至/onboarding (选择用户名等)。但是,我认为将来可能需要更多这些有条件的重定向。处理这些条件重定向的最佳方法是什么?是否可以有一个处理所有重定向的组件?

2 个答案:

答案 0 :(得分:1)

<Route>接受路由匹配时调用的onEnter挂钩。钩子看起来像这样:

function requireAuth(nextState, replace) {
    if (!loggedIn()) {
        replace({ pathname: 'login' });
    }
}

然后像这样使用它:

<Route path="/" component={AppPage}>
    <Route path="home" component={HomePage} onEnter={requireAuth}/>
    <Route path="login" component={LoginPage}/>
</Route>

一个更可组合的示例,可让您组合多个检查:

function checkAuth() {
    if (!loggedIn()) {
        return { pathname: 'login' };
    }
}

function checkOnboarding() {
    if (!completedOnboarding()) {
        return { pathname: 'onboarding' };
    }
}

function redirect(...checks) {
    return function(nextState, replace) {
        let result;
        checks.some(check => {
            result = check();
            return !!result;
        });
        result && replace(result);
    };
}

然后结合起来!

<Route path="/" component={AppPage}>
    <Route path="home" component={HomePage}
        onEnter={redirect(checkAuth, checkOnboarding)}/>
    <Route path="login" component={LoginPage}/>
    <Route path="onboarding" component={OnboardingPage}
        onEnter={redirect(checkAuth)}/>
</Route>

答案 1 :(得分:0)

您可以使用一个函数来检查用户是否已登录,然后只导入:

import {browserLocation} from './browser-location'
export default function checkLoggedIn() {
    if (localStorage.jwt === null)
        browserLocation.pushState('/login')
}