2015-04-10 17 views
33

Ho il seguente:Come impostare il defaultroute ad un'altra rotta in Reagire Router

<Route name="app" path="/" handler={App}> 
    <Route name="dashboards" path="dashboards" handler={Dashboard}> 
     <Route name="exploreDashboard" path="exploreDashboard" handler={ExploreDashboard} /> 
     <Route name="searchDashboard" path="searchDashboard" handler={SearchDashboard} /> 
     <DefaultRoute handler={DashboardExplain} /> 
    </Route> 
    <DefaultRoute handler={SearchDashboard} /> 
    </Route> 

Quando si utilizza il defaultroute, SearchDashboard rende in modo non corretto dal momento che ogni * Dashboard ha bisogno di rendering all'interno del cruscotto.

Vorrei che il mio DefaultRoute all'interno della "app" Route per puntare al Route "searchDashboard". È qualcosa che posso fare con React Router, o dovrei usare il normale Javascript (per un reindirizzamento di pagina) per questo?

In pratica, se l'utente accede alla pagina iniziale, desidero inviarli al pannello di ricerca. Quindi credo che sto cercando un Reagire Router funzione equivalente a window.location.replace("mygreathostname.com/#/dashboards/searchDashboard");

+1

Avete provato a utilizzare Redirect Instea d di DefaultRoute?

+0

@ JonatanLundqvistMedén è esattamente quello che stavo cercando, grazie! Scrivilo come risposta e lo contrassegnerò come corretto. Ci scusiamo per la risposta ritardata. –

risposta

42

È possibile utilizzare al posto di reindirizzamento defaultroute

<Redirect from="/" to="searchDashboard" /> 
+2

è solo per me, o quando si usa questo per colpire direttamente un url profondo, viene sempre reindirizzato all'URL "a", invece del percorso che sto cercando di colpire? – Pablote

+0

Dovresti notare che se stai facendo del reindirizzamento come 'from = '/ a' a = '/ a /: id'', dovrai usare' 'per includere il tuo componente' ' e '' da reagiscono-router. Dettagli vedi [doc] (https://github.com/ReactTraining/react-router/blob/dc2149ec0c63bfc95b71e40c81431e34cfbfeda9/packages/react-router/docs/api/Redirect.md#from-string) – Kulbear

+1

@Kulbear Ho avuto lo stesso problema . Facendo ciò che ha detto Ogglas nella sua risposta ha funzionato. –

9

risposta di Jonathan non sembra funzionare per me. Sto usando React v0.14.0 e React Router v1.0.0-rc3. Questo ha fatto:

<IndexRoute component={Home}/>.

Quindi, nel caso di Matteo, credo che avrebbe voluto:

<IndexRoute component={SearchDashboard}/>.

Fonte: https://github.com/rackt/react-router/blob/master/docs/guides/advanced/ComponentLifecycle.md

+0

Grazie per la condivisione. Stavo usando React v0.13 e la versione di React-Router per questo, quindi una versione pre-1.0/rc. Spero che questo aiuti gli altri! –

+0

Penso che questo ti faccia perdere il contesto. 'SearchDashboard' sarà il componente che vedrai quando arriverai alla homepage, ma non il componente' Dashboard' che lo sta avvolgendo se vai direttamente a '/ dashboard/searchDashboard'. React-router crea dinamicamente una gerarchia di componenti nidificati in base alle rotte corrispondenti all'URL, quindi penso che sia davvero necessario un reindirizzamento qui. –

32

stavo erroneamente cercando di creare un percorso predefinito con:

<IndexRoute component={DefaultComponent} /> 
<Route path="/default-path" component={DefaultComponent} /> 

Ma questo crea due percorsi diversi che rendono lo stesso componente. Non solo è inutile, ma può causare problemi nell'interfaccia utente, ad esempio quando si modellano gli elementi <Link/> in base a this.history.isActive().

Il modo giusto per creare un percorso predefinito (che non è il percorso indice) è quello di utilizzare <IndexRedirect/>:

<IndexRedirect to="/default-path" /> 
<Route path="/default-path" component={DefaultComponent} /> 

Questo si basa sul reagirà-router 1.0.0. Vedi https://github.com/rackt/react-router/blob/master/modules/IndexRedirect.js.

+0

Qual è il punto di avere un 'Route' per qualcosa che è già gestito dal tuo' IndexRoute'? –

+1

Non ha senso, e ho modificato la mia risposta per chiarire che non lo stavo sostenendo. – Seth

+1

Grazie, questa soluzione funziona bene in v1.0.0 –

1
<Route name="app" path="/" handler={App}> 
    <Route name="dashboards" path="dashboards" handler={Dashboard}> 
     <Route name="exploreDashboard" path="exploreDashboard" handler={ExploreDashboard} /> 
     <Route name="searchDashboard" path="searchDashboard" handler={SearchDashboard} /> 
     <DefaultRoute handler={DashboardExplain} /> 
    </Route> 
    <Redirect from="/*" to="/" /> 
    </Route> 
+0

Che cosa è equivalente a 'DefaultRoute' in' react-router' v4? –

+1

@AnthonyKong Penso che sia: ''. https://reacttraining.com/react-router/web/example/basic – TYMG

1

Il metodo preferito è quello di utilizzare il reagire router IndexRoutes componente

si utilizza in questo modo (dati tratti dal reagire documentazione router collegati sopra):

<Route path="/" component={App}> 
    <IndexRedirect to="/welcome" /> 
    <Route path="welcome" component={Welcome} /> 
    <Route path="about" component={About} /> 
</Route> 
0

mi sono imbattuto in una simile problema; Volevo un gestore di route predefinito se nessuno del gestore di percorsi corrispondeva.

Le mie soluzioni consiste nell'utilizzare un carattere jolly come valore del percorso. cioè Assicurati anche che sia l'ultima voce nella tua definizione di rotte.

<Route path="/" component={App} > 
    <IndexRoute component={HomePage} /> 
    <Route path="about" component={AboutPage} /> 
    <Route path="home" component={HomePage} /> 
    <Route path="*" component={HomePage} /> 
</Route> 
12

Il problema con l'utilizzo <Redirect from="/" to="searchDashboard" /> è se si dispone di un URL diverso, diciamo /indexDashboard e l'utente preme aggiorna o ottiene un URL inviato a loro, l'utente verrà reindirizzato alla /searchDashboard comunque.

Se wan't agli utenti di essere in grado di aggiornare il sito o inviare URL usano questo:

<Route exact path="/" render={() => (
    <Redirect to="/searchDashboard"/> 
)}/> 

Utilizzare questo se searchDashboard è dietro login:

<Route exact path="/" render={() => (
    loggedIn ? (
    <Redirect to="/searchDashboard"/> 
) : (
    <Redirect to="/login"/> 
) 
)}/> 
+0

Questa è la risposta accettata IMHO. – Dyna

2

Per chi proviene in 2017 , questa è la nuova soluzione con IndexRedirect:

<Route path="/" component={App}> 
    <IndexRedirect to="/welcome" /> 
    <Route path="welcome" component={Welcome} /> 
    <Route path="about" component={About} /> 
</Route> 
Problemi correlati