EDITZobacz inne odpowiedzi na nowe, nie reagują-Router nieaktualnych składni
Jest to dobry przykład jak używać haka onEnter
w auth-flow example. Oto odpowiedni kod:
function requireAuth(nextState, replaceState) {
if (!auth.loggedIn())
replaceState({ nextPathname: nextState.location.pathname }, '/login')
}
render((
<Router history={history}>
<Route path="/" component={App}>
<Route path="login" component={Login} />
<Route path="logout" component={Logout} />
<Route path="about" component={About} />
<Route path="dashboard" component={Dashboard} onEnter={requireAuth} />
</Route>
</Router>
), document.getElementById('example'))
Jak widać, gdy trasa jest dostępna /dashboard
funkcję requireAuth
jest tzw. Otrzymuje dwa argumenty: nextState
, który jest obiektem RouterState
reprezentującym stan, który użytkownik ma zamiar wprowadzić, oraz replaceState
, RedirectFunction
, który można wywołać w celu zastąpienia tego stanu czymś innym. W tym przypadku, jeśli użytkownik nie jest zalogowany, requireAuth
połączeń replaceState
tak:
replaceState({ nextPathname: nextState.location.pathname }, '/login')
Drugi argument jest oczywiście ścieżka użytkownik zostanie przekierowany. Pierwszym argumentem jest obiekt, który może zawierać dowolne dane, które chcemy mieć dla obsługi trasy (w tym przypadku komponentu Login
). Tutaj ścieżka, do której użytkownik próbował przejść (/dashboard
) jest ustawiona jako właściwość nextPathname
, więc po zalogowaniu użytkownik może zostać przekierowany na tę stronę (patrz metoda handleSubmit
w komponencie Login
).
Jeśli użytkownik jest zalogowany, to requireAuth
nic nie robi, a ponieważ replaceState
nigdy nie jest wywoływana, trasa działa tak jak zwykle, co oznacza, że komponent jest renderowany jako Dashboard
.
Dzięki tej dokładnej odpowiedzi! – Jason
Używam renderowania uniwersalnego i niestety ta metoda powoduje przekierowania 302. Czy istnieje sposób, w jaki mógłbym użyć przekierowań 301 w przypadku żądania serwera? –