现在,我的路由器看起来像这样:
<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
(选择用户名等)。但是,我认为将来可能需要更多这些有条件的重定向。处理这些条件重定向的最佳方法是什么?是否可以有一个处理所有重定向的组件?
答案 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')
}