2016-03-29 15 views
5

In questo momento, il mio router si presenta come segue:utente reindirizzamento in base allo stato in Reagire

<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 reindirizza al /login se l'utente non è connesso e OnboardedPage reindirizza /onboarding se l'utente non ha completato il flusso di onboarding (scelta del nome utente, ecc.). Tuttavia, penso che più di questi reindirizzamenti condizionali potrebbero essere necessari in futuro. Qual è il modo migliore per gestire questi reindirizzamenti condizionali? È possibile avere un singolo componente che gestisca tutti i reindirizzamenti?

risposta

0

Si potrebbe avere una funzione che controlla il se l'utente è connesso, e basta importare che:

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

Dovrò analizzare l'URL manualmente in questo modo giusto? Come se avessi bisogno di 'if (localStorage.jwt === null &&! Window.location.pathname.match (/^\/login (\/| $) /))' C'è un modo per farlo e continuare a usarlo React Router per analizzare l'URL? –

+0

Ho risposto alla mia risposta. Quindi, basta importare questa funzione e chiamarla nella porzione di rendering del componente a cui si sta eseguendo il routing. –

1

<Route> s accettano un gancio onEnter che viene chiamato quando le partite di percorso. Un gancio sarebbe simile a questa:

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

Quindi utilizzare in questo modo:

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

Un esempio più componibile, che consente di combinare più controlli:

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); 
    }; 
} 

Quindi combinare lontano!

<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> 
+0

+1, questo è un buon approccio, l'unica cosa che mi dà fastidio è che sostituisce l'aggiornamento dell'intera finestra e questo non è contenuto nello stile SPA. –

Problemi correlati